Spring Security:如何指定记住我的身份验证?

时间:2013-04-15 06:45:46

标签: grails spring-security remember-me

我正在开发基于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?我可以从登录视图的复选框中获取布尔值,但接下来我该怎么办?

2 个答案:

答案 0 :(得分:2)

Spring Security的架构基于servlet过滤器。您在上面实施的登录机制通常由UsernamePasswordAuthenticationFilter完成。另一个名为RememberMeAuthenticationFilter的过滤器负责记住我的功能。 authenticationManager根本不知道应用程序是否使用了remember-me功能。

如果您想将Spring Security与其他Web框架集成,请首先尝试了解这两个框架的过滤器如何一起发挥。

答案 1 :(得分:2)

由于您的问题特定于处理来自登录页面的复选框值(请记住我的标记),答案是您必须调用loginSuccessloginFail RememberMeServices方法。 loginSuccess在响应中添加了自动登录Cookie,loginFail删除了该Cookie。

但我猜上面的答案对你没有多大帮助,除非你确定在你的应用程序中配置了RememberMeServices。也许遵循配置RememberMeServices的步骤将帮助您按照自己的方式完成所有事情(或帮助您了解开箱即用的功能):

(1)创建一个实现RememberMeServicesLogoutHandler的类(称为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在其构造函数中需要authenticationManagerRememberMeServices

回答你的另一个问题是authenticationManager不需要知道任何关于记住我的事情。它是需要了解authenticationManagerRememberMeServices的过滤器(或任何处理自动登录的类)。 (换句话说,向RememberMeServices询问令牌并将其传递给authenticationManager以进行自动登录。