spring security bad credentials区分无效的用户名或密码

时间:2017-07-03 08:42:34

标签: java spring-security

在Spring Security中,如果用户名/密码不正确,我们可能会收到错误的凭据异常。

来自DOC:Spring Framework Authentication

java.lang.Object
  java.lang.Throwable
    java.lang.Exception
      java.lang.RuntimeException
        org.springframework.security.core.AuthenticationException
         org.springframework.security.authentication.BadCredentialsException

是否有任何异常类或方法来区分用户名无效或密码无效?

如下所示:

catch(BadCredentialsException e) {
    if(usernameInvalid) {
        // invalid username
    } else {
        // password invalid
    }
}

更新

 public class SampleDaoAuthenticationProvider extends DaoAuthenticationProvider {

        @Override
        protected void additionalAuthenticationChecks(UserDetails 
userDetails, UsernamePasswordAuthenticationToken authentication)
                throws AuthenticationException {
                setHideUserNotFoundExceptions(false);
                super.additionalAuthenticationChecks(userDetails, authentication);
        }
    }

1 个答案:

答案 0 :(得分:1)

警告:这样做不是一个好的安全措施。 但是,如果您真的不想隐藏UsernameNotFoundException,可以使用{{AuthenticationProvider(如果它从AbstractUserDetailsAuthenticationProvider延伸)将其抛出而不是BadCredentialException 1}}。

JavaDoc Extract:

  

默认情况下,如果找不到setHideUserNotFoundExceptionsAbstractUserDetailsAuthenticationProvider不正确,则BadCredentialsException会引发username。将此属性设置为password将导致false被抛出而不是前者。请注意,这被认为不如为两个例外投掷UsernameNotFoundException安全。

示例:

BadCredentialsException