请在Spring Security中提示,如何在用户登录时检查其他参数
例如,不仅要检查“用户名”和“密码”,还要检查他是否通过电子邮件链接注册;
所有数据都存储在DB中,我可以通过UserDetailsService的实现轻松获取;
但是如何使安全服务注意附加参数“isValidated”?
我现在正在使用Spring 3.2.0;
答案 0 :(得分:1)
实现此目的的一种方法是创建自定义AuthenticationProvider
或扩展现有自定义{{3}}。在您的情况下,扩展例如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
。
编辑:现在我看一下,第一个解决方案有点过于复杂。您可以轻松解决此问题,而无需使用自定义AuthenticationProvider
。如果帐户未得到确认,请确保isEnabled()
实施的UserDetails
返回false
。如果enabled
属性为false
,则不允许进行身份验证(Spring Security会自动执行此操作)。
如果要显式处理AccountNotConfirmedException
中的AuthenticationFailureHandler
,第一个解决方案可能仍然有用。