首页 > 解决方案 > 在身份验证之前检查用户启用状态 - Spring Security

问题描述

在我的 loadByUserName() 方法中,我通过邮件找到用户。目前,我的 User 类使用 isEnabled() 方法实现 UserDetails 来检查用户是否启用。但是,在身份验证之前会检查此启用标志,这样任何人都可以确定是否启用了另一个用户的帐户,无论使用什么密码。有没有办法在身份验证后检查启用的标志?

我的用户类:

@Entity
public class User implements UserDetails {

    @Column(name = "ativo")
    private Boolean ativo;

    //... some attributes, getters and setters

    @Override
    public boolean isEnabled() {
        if(this.ativo){
            return true;
        }else{
            return false;
        }
    }
}

我的 loadUserByUsername() 方法:

@Override
public User loadUserByUsername(String mail) {
    List<User> users = manager.findUserByMail(String mail);

    if (pessoas.isEmpty()) {
        throw new RuntimeException("User not found!");
    } 
    return users.get(0);
}

如果凭据错误或用户禁用,我更改了默认消息:

消息属性:

AbstractUserDetailsAuthenticationProvider.badCredentials = Mail/Password is incorrect!
AbstractUserDetailsAuthenticationProvider.disabled = User disabled!

标签: javaspringspring-security

解决方案


我想以一种您不仅可以在这种情况下使用,而且还可以在其他类似情况下使用的方式来回答这个问题。

应用程序的用户如何理解代码中发生的事情?他对您的代码一无所知,但我们(作为开发人员)是告诉他们幕后发生的事情以及首先使用 message.properties 执行的方法的人。

如果你不通知他们,他们就无法知道哪个方法先执行。因此您可以将两个属性更改为相同的消息,例如“密码不正确”。

当您想使用不存在的用户名登录时,这正是 Linux 操作系统中发生的事情 linux 不会告诉您该用户不存在,即使该用户不存在,它也会让您输入密码,然后通知您密码不正确。因为通常我们不应该向正在做恶意行为的人提供额外的信息。一般来说,这类信息对开发人员和监控目的非常有帮助。因此,您应该找到一种方法来记录此类信息以供将来使用,但不要将它们显示给用户。


推荐阅读