我使用多个身份验证提供程序配置spring security:
<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不会再次对用户进行身份验证。
答案 0 :(得分:2)
基本上,provider manager遍历所有身份验证提供程序并检查身份验证。默认情况下,如果存在 AuthenticationException 类型的任何错误,spring会检查另一个提供程序。
但您不想与其他提供商核实。要解决此问题,您需要拥有自己的提供程序管理器并覆盖authenticate方法。
我相信重写方法中的整个代码将保持相同,除了here。在这里,您只需要添加 break 语句。
它将如何运作?
正如您所提到的,您有两个提供商1)在内存中2)自定义身份验证提供程序。两者都将覆盖公共身份验证身份验证(身份验证身份验证)方法,如果凭据不匹配,此方法应抛出 BadCredentialsException 。
因此,在迭代providers(在您的自定义提供程序管理器中)时,内存提供程序中的将抛出 BadCredentialsException ,异常将捕获{{3} }。因为,您已经写了 break ,循环将退出,自定义提供程序管理器将不会去另一个提供程序检查身份验证。