防止 Spring Security 通过下一个身份验证提供程序对具有 BadCredentialException 的用户进行身份验证
Posted
技术标签:
【中文标题】防止 Spring Security 通过下一个身份验证提供程序对具有 BadCredentialException 的用户进行身份验证【英文标题】:Prevent spring security to authenticate users whom has BadCredentialException via next authentication provider 【发布时间】:2018-11-27 05:57:53 【问题描述】:我使用多个身份验证提供程序配置 spring 安全性:
<security:authentication-manager>
<security:authentication-provider>
<security:user-service>
<security:user name="testUser" password="TestPwd"
authorities="ROLE_USER" />
</security:user-service>
</security:authentication-provider>
<security:authentication-provider
ref="customAuthenticationProvider" />
</security:authentication-manager>
如果用户的密码在第一个提供商中无效,我想阻止通过第二个提供商对用户进行身份验证。例如,如果用户名为“testUser”的用户无法通过内存提供程序进行身份验证(因此,用户的密码不等于“TestPwd”),customAuthenticationProvider 不会再次对用户进行身份验证。
【问题讨论】:
【参考方案1】:所以基本上,provider manager 遍历所有身份验证提供程序并检查身份验证。默认情况下,如果有任何 AuthenticationException 类型的错误,spring 会检查另一个提供程序。
但您不想与其他提供商核实。要解决此问题,您需要拥有自己的提供程序管理器并覆盖 authenticate 方法。
我相信重写方法中的整个代码将保持不变,除了here。这里只需要添加 break 语句即可。
它将如何运作?
正如您所提到的,您有两个提供程序 1)在内存中 2)自定义身份验证提供程序。两者都将覆盖 public Authentication authenticate(Authentication authentication) 方法,如果凭据不匹配,此方法应抛出 BadCredentialsException。
因此,在迭代 providers(在您的自定义提供程序管理器中)时,您的 内存提供程序 将抛出 BadCredentialsException 并且异常会捕获 here。由于您已经编写了break,因此循环将退出,并且自定义提供程序管理器不会去其他提供程序检查身份验证。
【讨论】:
以上是关于防止 Spring Security 通过下一个身份验证提供程序对具有 BadCredentialException 的用户进行身份验证的主要内容,如果未能解决你的问题,请参考以下文章
Spring Boot、Spring Security - 防止 MongoDB 的直接 URL 查询
ldap spring security http基本身份验证
防止 Spring Boot 注册 Spring Security 过滤器之一