java - 为过期和锁定的用户创建自定义消息

标签 java spring spring-boot spring-security

如果用户在身份验证过程中被锁定或过期,我想返回自定义消息。我尝试实现这个:

@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

问题是,如果验证返回状态用户锁定用户过期的真值,如何创建返回一些自定义消息的处理程序?

最佳答案

最适合您的选择是:

  1. 在您的实体 Users 中实现 Spring UserDetails
  2. 使用 Spring AccountStatusUserDetailsChecker 类检查 loadUserByUsername 用户是否已被锁定等。
  3. 将管理这些异常所需的方法添加到 EngineExceptionHandler 中:LockedExceptionAccountExpiredException

您将在以下链接中看到上述要点的示例:

Point 1

Point 2

Points 2-3

关于java - 为过期和锁定的用户创建自定义消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62366374/

相关文章:

java - 如何通过Elasticsearch中的嵌套字段计算多个唯一文档?

java - Prepare 语句出现无效的列索引错误

java - Flink session 窗口的延迟输出缺失

java - Comparator.comparing(...).thenComparing(...) 找出哪些字段不匹配

java - Spring Data MongoDB 模板转换为错误的类

java - Spring Data Rest - 隐藏而不是暴露 ID

java - 通过@PostMapping解析对象,使用方法访问

Java:如何在不知道包名称的情况下扫描类?

java - Spring Data 中的自定义方法实现失败并出现属性未找到错误

java - Couchbase - 自动生成带有用户定义后缀的 key