gpt4 book ai didi

在所有级别的身份验证中使用 X509 的 Spring Security

转载 作者:行者123 更新时间:2023-11-28 23:24:23 25 4
gpt4 key购买 nike

我有一个遗留应用程序,我正在将其从用户密码转换为使用基于证书的身份验证。我使用的是 Tomcat 7,我的应用程序需要根据用户尝试访问的应用程序中的 URL 支持 4 种类型的安全

例如:一些 servlet 将使用 HTTP一些 servlet 将使用 HTTPS 而无需任何身份验证一些 servlet 将使用 PKI 进行相互身份验证,但用户不会事先知道,因此任何在证书链中拥有有效证书的用户都将被授予访问权限。应用程序的重置是管理,因此它将具有基于预定义用户证书 CN 的基于角色的访问。

我的 Tomcat server.xml 中有一个在 443 上运行 HTTPS 且 clientAuth="want"的连接器

我有我的应用程序 web.xml,它有一个 springSecurityFilterChain,它列出了我想要要求 HTTPS 的任何 URLS

我的 springSecurityContext.xml 有一个 x509 部分,其中有 subject-principal-regex="CN=(.*?),"user-service-ref="userDetailsS​​ervice"从属性文件中读取预注册的用户和角色.从那里,我列出了拦截 url 模式,其中我希望有一个 requires-channel="https"以及哪些模式需要哪些角色。

我还通过将 access="IS_AUTHENTICATED_ANONYMOUSLY"设置为拦截 url,在我希望它只需要 HTTPS 的地方添加了 url

这得到了我需要的 4 个要求中的 3 个,因为上面的任何 URL 都会使用 spring security 自动从 HTTP 重定向到 HTTPS,并根据角色强制执行用户凭证,或者根本不检查客户端证书。未放入 web.xml springSecurityFilterChain 的 url-patterns 将接受 HTTP 连接。

我想不通的是最终模式,即应用程序请求客户端证书,该证书将针对证书链中的 CA 进行验证,但不会针对我已知的具有角色的用户数据库进行验证。他们将拥有有效的证书,我需要访问客户端证书才能发现这些证书,但实际上在我的系统中并不为人所知,因为他们只是应用程序的一般用户。我不太确定如何完成此操作。

以下是我的 3 个 XML 文件中的一些片段,以显示我在说什么。我只在 springSecurity 中包含了 httpsandcertlink 以显示我要添加的那个,但无法开始工作。

服务器.xml

<Connector port="443" protocol="org.apache.coyote.http11.Http11Protocol"
maxThreads="150" SSLEnabled="true" scheme"https" secure="true"
clientAuth="want" sslProtocol"TLS"
keystoreFile="doesntmatter"
truststoreFile="doesntmatter" />

网络.xml

<login-config>
<auth-method>CLIENT-CERT</auth-method>
<realm-name>MYAPP</realm-name>
</login-config>

<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>

<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>*.go</url-pattern>
<url-pattern>/httpsonlylink</url-pattern>
<url-pattern>/httpsandcertlink</url-pattern>
</filter-mapping>

springSecurityContext.xml

<security:http xmlns="http://www.springframework.org/schema/security" >
<security:x509 subject-principal-regex="CN=(.*?)," user-service-ref="userDetailsService" />
<security:intercept-url pattern="/management**" requires-channel="https" access="ROLE_MGMT" />
<security:intercept-url pattern="/httpsonlylink**" requires-channel="https" access="IS_AUTHENTICAED_ANONYMOUSLY" />
<security:intercept-url pattern="/httpsandcertlink**" requires-channel="https" --not sure what to change here-- />
</security:http>

<security:authentication-manager xmlns="http://www.springframework.org/schema/security" alias="authenticationManager">
<security:authentication-provider>
<security:user-service id="userDetailsService" properties="\WEB-INF\users.properties" />
</security:authentication-provider>
</security:authentication-manager>

最佳答案

一种方法是通过创建一个自动分配给所有用户的附加“有效证书”角色来弥补角色要求中缺失的要求。应该已经需要一个有效的证书链,所以所需要的只是设置一个拦截 url 模式,该模式将匹配任何需要有效证书并需要“有效证书”角色的 URL,确保此规则匹配 < em>在需要特定角色的那些之后。

关于在所有级别的身份验证中使用 X509 的 Spring Security,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39110411/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com