如果用户在身份验证过程中被锁定或过期,我想返回自定义消息。我尝试实现这个:
@Service
public class UserDetailsHandler implements UserDetailsService {
@Autowired
private UsersService usersService;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
final Optional<Users> user = usersService.findByLogin(username);
if (!user.isPresent()) {
throw new UsernameNotFoundException("User '" + username + "' not found");
}
return user
.map(value -> {
return new User(
value.getLogin(),
value.getEncryptedPassword(),
value.getEnabled(),
hasAccountExpired(value.getExpiredAt()),
hasPasswordExpired(value.getPasswordChangedAt()),
hasAccountLocked(value.getLockedAt()),
Collections.singleton(new SimpleGrantedAuthority(value.getRole().getAuthority()))
);
}).orElseThrow(() -> new UsernameNotFoundException("User with username " + username + " not found"));
}
private boolean hasAccountExpired(LocalDateTime account_expired_at) {
return account_expired_at == null;
}
完整代码:GitHub
问题是,如果验证返回状态用户锁定
或用户过期
的真值,如何创建返回一些自定义消息的处理程序?
最佳答案
最适合您的选择是:
- 在您的实体
Users
中实现 SpringUserDetails
。 - 使用 Spring
AccountStatusUserDetailsChecker
类检查loadUserByUsername
用户是否已被锁定等。 - 将管理这些异常所需的方法添加到
EngineExceptionHandler
中:LockedException
、AccountExpiredException
等
您将在以下链接中看到上述要点的示例:
关于java - 为过期和锁定的用户创建自定义消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62366374/