Spring框架/Spring安全中的基于表单和基于证书的身份验证

4
在Spring框架中,是否可以同时拥有两种登录实现方式,即表单登录和基于证书的登录(x509)?我尝试过这两种方法中的任意一种,但将它们同时组合使用对我来说很难做到。有没有什么方法可以启用这两种方法?有哪些书籍或网站可以参考这方面的内容呢?
谢谢。
2个回答

2
是的,可以通过将SSL客户端认证设置为可选来实现。 这篇Baeldung文章是一篇关于使用X.509证书启用SSL客户端认证的好教程,其中强制执行客户端认证(对于您的情况,具有登录表单回退不好)。请按照该教程并注意在application.properties文件中将客户端认证设置为want而不是need,这将使客户端-服务器SSL握手尝试要求证书。
server.ssl.client-auth=want
  • 如果浏览器没有提供证书(没有配置任何证书或用户在提示选择证书列表时点击取消),SSL握手将在没有客户端证书的情况下完成,用户将必须使用用户名+密码登录。
  • 如果用户选择了证书,则使用客户端证书进行SSL握手。然后,服务器会在信任库中验证给定的证书。如果证书有效,则成功建立SSL握手。否则,服务器拒绝连接。

请注意:

  • 仅使用X.509证书进行身份验证。对于授权,您必须提供X509ConfigurerUserDetailsService实现,以检索通过x.509刚刚验证的用户的UserDetails
  • 因此,如果您有一个包含分配角色的用户数据库,即使证书在信任存储中,用户可能也不在用户数据库中,因此您需要在应用程序逻辑中处理这种可能性。即当SSL连接是相互的,但用户不存在于用户数据库中时。

0

是的,这是可能的。你所需要做的就是在你的http配置中声明x509支持:

<http ...>
    ...
    <x509 ... />
    ....
</http>

并在Tomcat中配置SSL。

请参见此条目此线程


1
谢谢你的回答。我遇到的问题是在我的登录页面上,我有两个登录验证方式。基于表单的认证和证书认证。我在tomcat的server.xml中设置了clientAuth参数为“want”,当我访问登录页面时,它会要求我选择一个证书。我希望只有在我点击证书认证按钮后才选择证书 =)。这可能吗?怎么做呢?=) - Warner
你使用的Tomcat版本是哪个?能否尝试clientAuth="optional"? - Maksym Demidas
嗨,Maksym Demidas。我正在使用Tomcat 6.0.36。在Tomcat文档中,我没有看到“optional”作为值。你设置为“optional”后,是否可以提示用户为所选受保护页面选择证书?我不希望浏览器要求我为登录页面选择证书 =)。谢谢。 - Warner
1
@MaksymDemidas:参考链接已经失效,请更新至最新版本 - https://docs.spring.io/spring-security/site/docs/current/reference/html/x509.html - Andrei Epure is hiring

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接