请在Spring Security中给出提示,如何在用户登录时检查附加参数。
例如,不仅要检查“用户名”和“密码”,还要检查他是否通过电子邮件链接确认注册;
所有数据都存储在数据库中,我可以通过 UserDetailsService 的实现轻松获取它;
但是如何让安全服务关注附加参数“isValidated”呢?
我现在使用 Spring 3.2.0;
最佳答案
实现此目的的一种方法是创建自定义 AuthenticationProvider
或扩展现有的。在您的情况下,扩展例如 DaoAuthenticationProvider
并在 additionalAuthenticationChecks()
方法中放置用于检查帐户是否已确认的逻辑就足够了。
这是一个例子:
public class CustomAuthenticationProvider extends DaoAuthenticationProvider {
@Override
protected void additionalAuthenticationChecks(UserDetails userDetails, UsernamePasswordAuthenticationToken authentication) throws AuthenticationException {
// Perform the checks from the super class
super.additionalAuthenticationChecks(userDetails, authentication);
// Cast the UserDetails to the implementation you use
User user = (User) userDetails;
// Check the confirmed status
if (!user.isAccountConfirmed()) {
throw new AccountNotConfirmedException("Account is not confirmed yet.");
}
}
public static class AccountNotConfirmedException extends AuthenticationException {
public AccountNotConfirmedException(String message) {
super(message);
}
}
}
您的UserDetails
实现应包含有关帐户确认状态的信息。您可以在 UserDetailsService
的实现中映射此信息。
选项 2
编辑:现在我看看,第一个解决方案有点过于复杂。您无需使用自定义 AuthenticationProvider 即可轻松解决此问题。如果帐户未确认,只需确保 UserDetails
实现的 isEnabled()
返回 false
即可。如果 enabled
属性为 false
将不允许身份验证(这由 Spring Security 自动处理)。
例如,如果您想在 AuthenticationFailureHandler
中显式处理 AccountNotConfirmedException
,第一个解决方案可能仍然有用。
关于java - 使用 Spring Security 检查额外参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27658030/