【问题标题】:User enabled status is checked before authentication - Spring Security在身份验证之前检查用户启用状态 - Spring Security
【发布时间】:2020-09-22 22:07:37
【问题描述】:

在我的 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);
}

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

messages.properties:

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

【问题讨论】:

  • 您好,如果您向我们展示您当前正在运行的代码/方法会更好,因为没有必要告诉我们您的方法名称,而且我们不知道代码是关于什么或正在运行的代码好吧。所以会有其他人的一些建议,这将有助于其他人,特别是在未来的这个特定领域。谢谢
  • 嗨!我编辑了我的问题。谢谢!
  • 我建议简单地将消息更改为两者相同。类似于 未知的用户名/密码。不管它是否启用。告诉他们这也是一种安全漏洞。另一方面,您的 loadByUsername 方法存在缺陷(它不遵守合同!)。它应该抛出一个UsernameNotFound 异常而不是一个普通的RuntimeException。

标签: java spring spring-security


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2013-11-21
    • 1970-01-01
    • 2015-08-09
    • 1970-01-01
    • 2018-08-31
    • 2017-12-05
    • 2014-12-20
    • 2021-12-18
    • 1970-01-01
    相关资源
    最近更新 更多