【发布时间】: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