我正在寻找一种可靠的方法来对登录时的用户凭据执行输入验证。具体来说-用户名符合一定的大小限制:如果提供的值太大,请快速失败,而不要传递给userDetailsService
。
有点粗略的解决方案是在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
)似乎也是一个可能的方向。但是我不确定如何在当前设置中利用这些机制。
有人可以提供一些指导吗?
您需要通过首先注册LocalValidatorFactoryBean
和MethodValidationPostProcessor
来启用bean验证支持。 (有关详情,请参阅this)。如果您使用的是spring-boot,则其自动配置应该已经为您配置了它们。
之后,可以使用@Validated
和@Size
来验证方法参数:
@Service
@Validated
public class MyUserDetailsService implements UserDetailsService {
public UserDetails loadUserByUsername(@Size(max = MAX_USERNAME_LEN) String username) throws UsernameNotFoundException {
}
}