java - 防止 Spring Security 通过下一个身份验证提供程序对具有 BadCredentialException 的用户进行身份验证
问题描述
我使用多个身份验证提供程序配置弹簧安全性:
<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 不会再次对用户进行身份验证。
解决方案
所以基本上,提供者管理器遍历所有身份验证提供者并检查身份验证。默认情况下,如果有任何AuthenticationException类型的错误,spring 会检查另一个提供者。
但是您不想与其他提供商核实。要解决此问题,您需要拥有自己的提供程序管理器并覆盖身份验证方法。
我相信覆盖方法中的整个代码将保持不变,除了这里。在这里你只需要添加break语句。
它将如何运作?
正如您所提到的,您有两个提供者 1)在内存中 2)自定义身份验证提供者。两者都将覆盖公共身份验证身份验证(身份验证身份验证)方法,如果凭据不匹配,此方法应抛出BadCredentialsException 。
因此,在遍历提供者(在您的自定义提供者管理器中)时,您的内存提供者将抛出BadCredentialsException并且异常会在此处捕获。由于您已经编写了break,循环将退出,并且自定义提供程序管理器不会去另一个提供程序检查身份验证。
推荐阅读
- excel - VBA 正在将我的 Sharepoint UNC 路径转换为 URL
- pyspark - Pyspark:如何将行分组为 N 组?
- rust - 为什么 Rust HashMap 不允许使用“没有为结构 `HashMap` 找到名为 `insert` 的方法”插入值
- arrays - 派生数据类型中的 Fortran 字符数组
- python - ImageGrab 没有抓取精确的 bbox 图像
- java - 如何在 java 中获取 Linux 发行版
- spring-boot - StatusAggregator 的自定义实现
- pytorch - 在 python 中断言一个对象是什么意思?
- python - 使用 nltk 按日期标记化
- android - 如何在webview的html页面中下载pdf