使用 Spring 3.1 的混合模式 X509 身份验证
Posted
技术标签:
【中文标题】使用 Spring 3.1 的混合模式 X509 身份验证【英文标题】:mix-mode X509 Authentication with Spring 3.1 【发布时间】:2013-04-14 16:08:48 【问题描述】:我对 Spring 有点陌生,也是 SSL 身份验证的新手。
我的问题是我有一个 Web 应用程序,它可以很好地与基于表单的身份验证配合使用。我需要使用 SSL 客户端身份验证自动对我的应用程序的一部分进行身份验证。
到目前为止我做了什么。
-
SSL启用tomcat(我可以访问https://mydomain.com:9443)
将客户端证书导入服务器信任库
更改 server-xml 并在我的 server.xml 中设置 clientAuth="want"
连接器端口="9443" 协议="HTTP/1.1" SSL启用=“真” maxThreads="150" 方案="https" 安全=“真” clientAuth="想要" sslProtocol="TLS" keystoreFile="c:\serverkeystore" keystorePass="ChangeIt" />在我的安全中的 http 下添加了 x509 subject-principal-regex="CN=(.*?)," user-service-ref="customUserDetailService" -上下文.xml
?)," user-service-ref="myUserDetailService" />添加 以保护 url myUserDetailService 正在实现 UserDetailsService 并返回 UserDetails 对象(我用于基于表单的身份验证的同一类,基于数据库存储的用户名、密码、角色)。authentication-failure-url="/login.jsp?error=1" />
我的问题是任何 URL 路径(即使使用 /upload)它总是向我显示 login.jsp 页面。
我正在使用 Spring 和 Spring security 3.1.3 和 tomcat 6.0.35
任何帮助将不胜感激。
【问题讨论】:
@Michael 抱歉,因为我们正忙于处理其他问题,所以我还不能尝试。我会尽快做。 你测试成功了吗? 【参考方案1】:你必须分开问题:
-
通过客户端证书验证所有
/upload
URLs
通过表单认证其他网址进行认证
以下配置将允许在 SpringSecurity 3.1 中单独解决这些问题:
<http pattern="/upload/**" >
<intercept-url pattern="/*" access="hasRole('ROLE_USER')" requires-channel="https"/>
<x509 subject-principal-regex="CN=(.?)," user-service-ref="myUserDetailService" />
</http>
<http use-expressions="true">
<intercept-url pattern="/login.jsp*" access="IS_AUTHENTICATED_ANONYMOUSLY"/>
<intercept-url pattern="/**" access="ROLE_USER"/>
<form-login login-page="/login.jsp"
default-target-url="/index.jsp"
authentication-failure-url="/login.jsp?error=1" />
<logout logout-url="/j_spring_security_logout" logout-success-url="/loggedout.jsp" delete-cookies="JSESSIONID"/>
</http>
【讨论】:
会试试迈克尔。谢谢!以上是关于使用 Spring 3.1 的混合模式 X509 身份验证的主要内容,如果未能解决你的问题,请参考以下文章
用于身份验证的 Grails Spring Security X509 和用于权限的 LDAP
GWT 开发模式 + Spring 3.1 + Hibernate 4.0.1 中的异常
在 xws-security for Spring-WS 中支持 X509PKIPathv1
Grails 中基于 RESTful 证书的 (X509) 登录身份验证
docker pull 失败报错:x509: certificate has expired or is not yet valid