我正在开发基于Grails和Vaadin 7的应用程序。我设法使它们与SpringSecurity一起工作以进行身份验证和授权,但我必须开发自己的服务,调用Spring Security身份验证管理器使其与Vaadin一起使用:
class SecurityService {
static transactional = true
def springSecurityService
def authenticationManager
void signIn(String username, String password) {
try {
def authentication = new UsernamePasswordAuthenticationToken(username, password)
SCH.context.authentication = authenticationManager.authenticate(authentication)
} catch (BadCredentialsException e) {
throw new SecurityException("Invalid username/password")
}
}
}
问题是现在我需要实现remember me
身份验证,我不知道从哪里开始。
如何让authenticationManager
知道我希望它使用remeberMeAuthentication
?我可以从登录视图的复选框中获取布尔值,但接下来我该怎么办?
答案 0 :(得分:2)
Spring Security的架构基于servlet过滤器。您在上面实施的登录机制通常由UsernamePasswordAuthenticationFilter
完成。另一个名为RememberMeAuthenticationFilter
的过滤器负责记住我的功能。 authenticationManager
根本不知道应用程序是否使用了remember-me功能。
如果您想将Spring Security与其他Web框架集成,请首先尝试了解这两个框架的过滤器如何一起发挥。
答案 1 :(得分:2)
由于您的问题特定于处理来自登录页面的复选框值(请记住我的标记),答案是您必须调用loginSuccess
或loginFail
RememberMeServices方法。 loginSuccess
在响应中添加了自动登录Cookie,loginFail
删除了该Cookie。
但我猜上面的答案对你没有多大帮助,除非你确定在你的应用程序中配置了RememberMeServices
。也许遵循配置RememberMeServices
的步骤将帮助您按照自己的方式完成所有事情(或帮助您了解开箱即用的功能):
(1)创建一个实现RememberMeServices
和LogoutHandler的类(称为myRememberMeServices)。
(2)在autoLogin
方法中,在解析cookie值后创建一个认证对象(UsernamePasswordAuthenticationToken)。
(3)在loginFail
方法中,取消cookie。
(4)在loginSuccess
方法中,创建一个自动登录cookie。添加您将在autoLogin方法中使用的值。通常cookie值是加密的。
(5)在logout
方法中,取消cookie。
(6)在以下四个位置注入myRememberMeServices并调用适当的方法:
(a) At the time of successful login (if checkbox value is set),
(b) At the time of failed login,
(c) On logout, and
(d) In filter that does autologin
值得注意的是RememberMeAuthenticationFilter在其构造函数中需要authenticationManager
和RememberMeServices
。
回答你的另一个问题是authenticationManager
不需要知道任何关于记住我的事情。它是需要了解authenticationManager
和RememberMeServices
的过滤器(或任何处理自动登录的类)。 (换句话说,向RememberMeServices
询问令牌并将其传递给authenticationManager
以进行自动登录。