我有自己的spring srcurity auth提供者:
public class MyLdapAuthProvider implements AuthenticationProvider
@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
if(goodCredetials()){
return authenticateUserPassword((UsernamePasswordAuthenticationToken) authentication);
} else {
throw new BadCredentialsException("bad credentials");
}
}
我不明白如果在方法中我知道凭证是坏的,我应该返回什么
1 - 抛出AuthenticationException
2 - 返回null
我测试了这个并且我没有看到差异
<security:authentication-manager>
<security:authentication-provider ref="provider1"/>
<security:authentication-provider user-service-ref="provider2"/>
</security:authentication-manager>
DOC:
验证身份验证(身份验证身份验证) 抛出AuthenticationException 使用与AuthenticationManager.authenticate(身份验证)相同的协议执行身份验证。 参数: authentication - 身份验证请求对象。 返回: 完全身份验证的对象,包括凭据。如果AuthenticationProvider无法支持身份验证,则可能返回null 传递的Authentication对象。在这种情况下,下一个 AuthenticationProvider,支持显示的身份验证 上课将被尝试。 抛出: AuthenticationException - 如果身份验证失败。
答案 0 :(得分:1)
阅读doc。如果你返回null,你告诉spring你不能支持这种身份验证方法,它应该尝试下一个提供者(如果有的话)。
我的猜测是,如果你扔了,你就打破了与不同提供者一起尝试的链条。只要你有一个authProvider而不是它们的集合,它就不应该有太大的区别。
此外,在失败的auth上,你应该抛出AuthenticationException,而不是BadCredentials?