java - 在 Spring Security 中的 FORM_LOGIN_FILTER 之后添加可选的身份验证步骤

标签 java spring authentication spring-security

我在 Web 应用程序中使用 Spring Security 有一个基本的登录工作流程:用户通过表单登录,最终由 UserDetailsService 中的应用程序逻辑处理。从 DaoAuthenticationProvider 调用使用 UsernamePasswordAuthenticationFilter 创建的 token .

但是,在某些情况下(通过用户首选项在运行时决定),我希望在此之后有一个额外的身份验证步骤(基本上是两因素身份验证)。我尝试添加另一个过滤器,如下所示

<custom-filter ref="twoFactorAuthFilter" after="FORM_LOGIN_FILTER"/>

但是如果表单登录成功,则永远不会调用此过滤器。我的计划是创建一个特殊的 TwoFactorAuthenticationToken TwoFactorAuthenticationProvider 可以接受但由于未调用过滤器,因此我的新身份验证提供程序也未调用。如果登录凭据错误,我希望整个安全链中止,但如果登录凭据正确,则继续遍历它,并继续(可选)下一步。

是否可以按照我想要的方式进行操作,而无需重写现有的 UsernamePasswordAuthenticationFilter ?我觉得这一定很容易,因为 Spring 通常具有很好的可扩展性,但我已经为此奋斗了很多天,但还没有取得任何成功。

最佳答案

您想要的是有两个过滤器:一个用于 userNamePasswordFilter,另一个用于您的 tokenFilter。如果您的用户启用了双因素身份验证,则 daoAuthenticationProvideruserDetailsS​​ervice 应仅授予他一个角色为“ROLE_PRE_AUTH”的 SimpleGrantedAuthority 实例例如。对 tokenFilter 的访问权限应仅提供给具有此角色 -“ROLE_PRE_AUTH”的用户,并且该过滤器应尝试对您的辅助 token 进行身份验证,并继续向用户授予其实际权限(USER、ADMIN 等)来自tokenProvider。 显示附加弹出表单的方法是再次检查用户的角色是否为“ROLE_PRE_AUTH”。

关于java - 在 Spring Security 中的 FORM_LOGIN_FILTER 之后添加可选的身份验证步骤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26545343/

相关文章:

java - 自顶向下、非递归合并

java - Button ActionListener 未在扩展 JPanel 的类中调用

java - 向类添加静态方法并委托(delegate)给现有方法

java - Spring Boot 为返回 CompletionStage 的请求运行过滤器两次

mysql - 如何在Django中使用遗留数据库模仿request.user?

PHP 摘要 HTTP 身份验证示例不起作用,为什么?

java - 何时使用 MongoDB Driver/Morphia 而不是 Hibernate

java - 不同实体管理器之间共享 JPA 实体

java - Autowiring 或新的 RetryTemplate

linux - 将 .so 文件插入到 unix 上的 common-auth 文件中