1

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

4

2 回答 2

2

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

如果你想将 Spring Security 与另一个 web 框架集成,首先尝试找出两个框架的过滤器是如何一起发挥作用的。

于 2013-04-15T08:19:13.520 回答
2

由于您的问题是针对来自登录页面的复选框值(记住我标志)的处理,因此答案是您必须调用RememberMeServicesloginSuccessloginFail方法。在响应中添加自动登录 cookie 并删除该 cookie。loginSuccessloginFail

但我想上面的答案对你没有多大帮助,除非你确定你已经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在其构造函数中采用authenticationManagerand 。RememberMeServices

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

于 2013-04-15T15:50:29.277 回答