Grails SpringSecurity:如何指定RememberMe身份验证?

Grails SpringSecurity:如何指定RememberMe身份验证?,grails,spring-security,remember-me,Grails,Spring Security,Remember Me,我正在开发一个基于Grails和Vaadin 7的应用程序。我设法让他们与SpringSecurity一起进行身份验证和授权,但我必须开发自己的服务,调用Spring Security authentication manager使其与Vaadin一起工作: class SecurityService { static transactional = true def springSecurityService def authenticationManager

我正在开发一个基于Grails和Vaadin 7的应用程序。我设法让他们与SpringSecurity一起进行身份验证和授权,但我必须开发自己的服务,调用Spring Security authentication manager使其与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")
        }
    }
}
问题是现在我需要实现一个memberme身份验证,我不知道从哪里开始


如何使authenticationManager知道我希望它使用RemeberMauthentication?我可以从登录视图上的复选框中获取布尔值,但接下来该如何处理它?

Spring Security的体系结构基于servlet过滤器。上面实现的登录机制通常由UsernamePasswordAuthenticationFilter完成。另一个名为RememberAuthenticationFilter的过滤器负责记忆我的功能。authenticationManager根本不知道应用程序是否使用了“记住我”功能


如果您想将Spring Security与另一个web框架集成,请首先尝试了解这两个框架的过滤器如何协同工作。

Spring Security的体系结构基于servlet过滤器。上面实现的登录机制通常由UsernamePasswordAuthenticationFilter完成。另一个名为RememberAuthenticationFilter的过滤器负责记忆我的功能。authenticationManager根本不知道应用程序是否使用了“记住我”功能


如果您想将Spring Security与另一个web框架集成,请首先尝试了解这两个框架的过滤器如何协同工作。

由于您的问题是针对来自登录页面的复选框值RememberMe标志的处理,答案是您必须调用的LoginSAccess或loginFail方法。LoginAccess在响应中添加自动登录cookie,loginFail删除该cookie

但我想上面的答案不会对你有多大帮助,除非你确定你的应用程序中配置了RememberServices。也许以下配置MemberMemberServices的步骤将帮助您按照自己的方式完成整个工作,或者帮助您理解开箱即用的功能:

1创建一个名为MyMemberServices的类,该类实现了RememberServices和

2在autoLogin方法中,在解析cookie值后创建身份验证对象UsernamePasswordAuthenticationToken

3在loginFail方法中,取消cookie

4在LoginSAccess方法中,创建一个自动登录cookie。添加您将在autoLogin方法中使用的值。通常cookie值是加密的

5在注销方法中,取消cookie

6在以下四个位置注入MyMemberServices并调用适当的方法:

(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 
值得注意的是,authenticationManager和membermereservices在其构造函数中使用


您的另一个问题的答案是,authenticationManager不需要了解任何有关记住我的信息。需要了解authenticationManager和MemberMemberServices的是筛选器或任何处理自动登录的类。换句话说,向MemberMemberServices请求一个令牌,并将其传递给authenticationManager以进行自动登录。

由于您的问题特定于处理来自登录页面的复选框值RememberMe标志,答案是您必须调用的LoginsAccess或loginFail方法。LoginAccess在响应中添加自动登录cookie,loginFail删除该cookie

但我想上面的答案不会对你有多大帮助,除非你确定你的应用程序中配置了RememberServices。也许以下配置MemberMemberServices的步骤将帮助您按照自己的方式完成整个工作,或者帮助您理解开箱即用的功能:

1创建一个名为MyMemberServices的类,该类实现了RememberServices和

2在autoLogin方法中,在解析cookie值后创建身份验证对象UsernamePasswordAuthenticationToken

3在loginFail方法中,取消cookie

4在LoginSAccess方法中,创建一个自动登录cookie。添加您将在autoLogin方法中使用的值。通常cookie值是加密的

5在注销方法中,取消cookie

6在以下四个位置注入MyMemberServices并调用适当的方法:

(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 
值得注意的是,authenticationManager和membermereservices在其构造函数中使用


您的另一个问题的答案是,authenticationManager不需要了解任何有关记住我的信息。需要了解authenticationManager和MemberMemberServices的是筛选器或任何处理自动登录的类。换句话说,向MemberMemberServices索要一个令牌,并将其传递给authenticationManager进行自动登录。

不要因为我的回答而气馁,这可能比最初看起来更容易。你只需要一个黏液
d了解您使用的框架的体系结构。要了解Spring安全性的基本架构,我建议阅读本手册的第6、8和9章。总共大约有20页,没那么可怕。谢谢你,我会尝试深入研究SpringSecurity和Vaadin。不要被我的回答吓倒,这可能比最初看起来更容易做到。您只需要很好地理解所使用的框架的体系结构。要了解Spring安全性的基本架构,我建议阅读本手册的第6、8和9章。总共有20页左右,没那么可怕。谢谢你,我会尝试深入讨论SpringSecurity和Vaadin。谢谢你的指导。我会深入研究斯普林安全和瓦丁。我现在无法检查你的答案是否完整,但我想它给出了应该做什么的概要,所以我会接受它。谢谢你的指导。我会深入研究斯普林安全和瓦丁。我现在无法检查你的答案是否完整,但我想它给出了应该做什么的概要,所以我会接受它。