【问题标题】:Problem with Remember Me Service in Spring SecuritySpring Security 中的记住我服务的问题
【发布时间】:2011-01-28 01:32:09
【问题描述】:

我正在尝试使用 Spring 在我的网站中实现“记住我”功能。 persistent_logins 表中的 cookie 和条目已正确创建。此外,当用户名显示在页面顶部时,我可以看到正在恢复正确的用户。

但是,一旦我尝试访问此用户在“记住”后返回时的任何信息,我就会收到 NullPointerException。看起来好像没有再次在会话中设置用户。

我的 applicationContext-security.xml 包含以下内容:

<remember-me data-source-ref="dataSource" user-service-ref="userService"/>

...

<authentication-provider user-service-ref="userService" />

<jdbc-user-service id="userService" data-source-ref="dataSource" 
role-prefix="ROLE_"
users-by-username-query="select email as username, password, 1 as ENABLED from user where email=?" 
authorities-by-username-query="select user.id as id, upper(role.name) as authority from user, role, users_roles where users_roles.user_fk=id and users_roles.role_fk=role.name and user.email=?"/>

我认为这可能与按用户名查询有关,但如果此查询不正确,登录肯定无法正常工作?

对此的任何帮助将不胜感激。

谢谢, 齿轮。

【问题讨论】:

  • 请记住,您的安全配置中可能有两个关键参数。一个为 RememberMeAuthenticationProvider 和一个用于 TokenBasedRememberMeServices。确保它们相等。
  • @kboom 感谢您提到有两个键!

标签: spring-security remember-me


【解决方案1】:

能否请您包含异常的整个堆栈跟踪?我怀疑是因为您没有在上面指定的 remember-me 配置中设置 key 属性,因此没有在 SecurityContextHolder 上设置令牌。

要查看Remember Me 工作原理的详细信息,您应该查看RememberMeAuthenticationFilter 的源代码。您可以在此处(直接)找到该来源:

http://grepcode.com/file/repo1.maven.org/maven2/org.springframework.security/spring-security-web/3.0.2.RELEASE/org/springframework/security/web/authentication/rememberme/RememberMeAuthenticationFilter.java

RememberMeAuthenticationFilter 将调用 RememberMeAuthenticationProvider 作为结果:

rememberMeAuth = authenticationManager.authenticate(rememberMeAuth);

在authenticate方法里面可以看到如果不指定key就会抛出异常:

 if (this.key.hashCode() != ((RememberMeAuthenticationToken) authentication).getKeyHash()) {
            throw new BadCredentialsException(messages.getMessage("RememberMeAuthenticationProvider.incorrectKey",
                    "The presented RememberMeAuthenticationToken does not contain the expected key"));
        }

键字面上可以是任何字符串“your-company-name-{GUID}”或类似的东西。所以你的记住我看起来更像这样:

<remember-me key="your-company-name-rmkey-aWeFFTgxcv9u1XlkswUUiPolizxcwsqUmml" token-validity-seconds="3600" data-source-ref="dataSource"/>

设置令牌有效性是一个非常好的主意,您应该这样做。

授予

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-28
    • 2016-10-28
    • 2012-04-20
    • 2018-12-02
    • 2015-05-10
    • 2012-01-21
    相关资源
    最近更新 更多