Spring security Spring Security中的“记住我”服务存在问题

Spring security Spring Security中的“记住我”服务存在问题,spring-security,remember-me,Spring Security,Remember Me,我正在尝试使用Spring在我的网站中实现“记住我”的功能。持久登录表中的cookie和条目创建正确。此外,我可以看到正确的用户正在恢复,因为用户名显示在页面顶部 然而,一旦我尝试访问该用户在“记住”后返回的任何信息,我就会得到一个NullPointerException。看起来好像没有在会话中再次设置用户 My applicationContext-security.xml包含以下内容: <remember-me data-source-ref="dataSource" user-ser

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

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

My 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=?"/>

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

在此方面的任何帮助都将不胜感激

谢谢,
gearoid.

您能包含异常的整个堆栈跟踪吗?我怀疑,因为您没有在上面指定的memberme配置上设置key属性,所以没有在SecurityContextHolder上设置令牌

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

由于以下原因,RememberAuthenticationFilter将调用RememberAuthenticationProvider:

rememberMeAuth = authenticationManager.authenticate(rememberMeAuth);
在authenticate方法中,您可以看到,如果未指定密钥,它将引发异常:

 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"/>

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


Grant

请记住,您的安全配置中可能有两个关键参数。对于RememberAuthenticationProvider,打开一个;对于TokenBasedMemberMeservices,打开一个。确保它们相等。@kboom感谢您提到有两把钥匙!