java - 在身份验证之前检查用户启用状态 - 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!
解决方案
我想以一种您不仅可以在这种情况下使用,而且还可以在其他类似情况下使用的方式来回答这个问题。
应用程序的用户如何理解代码中发生的事情?他对您的代码一无所知,但我们(作为开发人员)是告诉他们幕后发生的事情以及首先使用 message.properties 执行的方法的人。
如果你不通知他们,他们就无法知道哪个方法先执行。因此您可以将两个属性更改为相同的消息,例如“密码不正确”。
当您想使用不存在的用户名登录时,这正是 Linux 操作系统中发生的事情 linux 不会告诉您该用户不存在,即使该用户不存在,它也会让您输入密码,然后通知您密码不正确。因为通常我们不应该向正在做恶意行为的人提供额外的信息。一般来说,这类信息对开发人员和监控目的非常有帮助。因此,您应该找到一种方法来记录此类信息以供将来使用,但不要将它们显示给用户。
推荐阅读
- python - 如何从具有特殊类名的网页中提取元素?
- sql - 更新 SQL 语句问题 - 没有为一个或多个必需参数提供值 - 用 Visual Basic 编码
- c# - 如何使用组合框更改排序顺序?
- javascript - 为什么用户数据不存储到 Firebase Firestore 中?
- azure-devops - Azure DevOps 发布任务 SQL 表 - 查找我们复制到的所有服务器
- java - 如何从特定子路径中检索整个数据并将它们分配到该模型类中,如下所示的 Firebase 实时数据库?
- mongodb - 执行 $lookup 聚合时如何在数组上执行 $elemMatch?
- python - 在Python中将大列表折叠成较小的列表?
- flutter - 我尝试获取数据但我有错误:类型'String'不是'index'类型'int'的子类型
- shell - sed:重命名文件中的选择性字符串