【问题标题】:SpringSecurity: how to specify remember me authentication?SpringSecurity:如何指定记住我的身份验证?
【发布时间】:2013-04-15 23:50:29
【问题描述】:

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

【问题讨论】:

    标签: grails spring-security remember-me


    【解决方案1】:

    由于您的问题是针对来自登录页面的复选框值(记住我标志)的处理,答案是您必须调用RememberMeServicesloginSuccessloginFail 方法。 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 以进行自动登录)。

    【讨论】:

    • 感谢您的指导。我将尝试更深入地了解 SpringSecurity 和 Vaadin。我现在无法检查您的答案是否完整,但我想它概述了应该做什么,所以我会接受它。
    【解决方案2】:

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

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

    【讨论】:

    • 不要因为我的回答而气馁,这可能比最初看起来更容易。您只需要很好地了解您使用的框架的架构。要了解 Spring Security 的基本架构,我建议阅读reference docs 的第 6、8 和 9 章。总共打印了大约 20 页,没有那么可怕。
    • 谢谢,我会尝试更深入地了解 SpringSecurity 和 Vaadin。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-30
    • 2021-08-12
    • 2010-11-02
    • 2013-03-29
    • 2018-06-06
    相关资源
    最近更新 更多