Spring security spring安全登录:验证输入

Spring security spring安全登录:验证输入,spring-security,bean-validation,Spring Security,Bean Validation,我正在寻找一个健全的方法来执行登录时的用户凭据输入验证。具体来说-用户名符合某些大小限制:如果提供的值太大,则快速失败,而不是将其传递给userdetails服务 一个有点粗糙的解决方案是在gate,即userDetailsService中显式测试此条件: @Service public class MyUserDetailsService implements UserDetailsService { public UserDetails loadUserByUsername(Stri

我正在寻找一个健全的方法来执行登录时的用户凭据输入验证。具体来说-用户名符合某些大小限制:如果提供的值太大,则快速失败,而不是将其传递给
userdetails服务

一个有点粗糙的解决方案是在gate,即
userDetailsService
中显式测试此条件:

@Service
public class MyUserDetailsService implements UserDetailsService {
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        if (username.length() > MAX_USERNAME_LEN )
            throw new BadCredentialsException("username too long");
            //...
    }
}
从域模型的角度来看,大小限制可以表示为用户实体上的验证约束(
@size(max=…)
)。由于用户名是一个请求参数,请求验证(
@Valid
)似乎也是一个可能的方向。但我不确定如何在当前设置中利用这些机制


有人能提供一些指导吗?

您需要先注册
LocalValidatoryFactoryBean
MethodValidationPostProcessor
来启用bean验证支持。(有关详细信息,请参阅)。如果您使用的是SpringBoot,那么它的自动配置应该已经为您配置好了

之后,您可以使用
@Validated
@Size
验证方法参数:

@服务
@验证
公共类MyUserDetailsService实现UserDetailsService{
public UserDetails loadUserByUsername(@Size(max=max\u USERNAME\u LEN)字符串USERNAME)引发UsernameNotFoundException{
}
}

谢谢
loadUserByUsername
被重写,因此上面生成了一个
javax.validation.ConstraintDeclarationException:只有继承层次结构中被重写的方法的根方法可以用参数约束进行注释。
添加委托会降低此解决方案的吸引力。此外,它还会触发http 500。我最初的解决方案引发了一个
BadCredentialsException
,它重定向到身份验证错误页面——最好是内部服务器错误。