Ger*_*Ger 5 spring-security remember-me
我正在尝试使用 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=?"/>
Run Code Online (Sandbox Code Playgroud)
我认为这可能与按用户名查询用户有关,但如果此查询不正确,登录肯定无法正常工作?
对此的任何帮助将不胜感激。
谢谢,齿轮。
您能否包括异常的整个堆栈跟踪?我怀疑是因为您没有在上面指定的记住我配置上设置 key 属性,所以没有在 SecurityContextHolder 上设置令牌。
要查看“记住我”如何工作的详细信息,您应该查看“RememberMeAuthenticationFilter”的来源。您可以在此处(直接)找到该来源:
由于以下原因,RememberMeAuthenticationFilter 将调用 RememberMeAuthenticationProvider:
rememberMeAuth = authenticationManager.authenticate(rememberMeAuth);
Run Code Online (Sandbox Code Playgroud)
在 authentication 方法中,您可以看到如果您不指定密钥,它将抛出异常:
if (this.key.hashCode() != ((RememberMeAuthenticationToken) authentication).getKeyHash()) {
throw new BadCredentialsException(messages.getMessage("RememberMeAuthenticationProvider.incorrectKey",
"The presented RememberMeAuthenticationToken does not contain the expected key"));
}
Run Code Online (Sandbox Code Playgroud)
键字面上可以是任何字符串“your-company-name-{GUID}”或类似的东西。那么你的记住我看起来更像这样:
<remember-me key="your-company-name-rmkey-aWeFFTgxcv9u1XlkswUUiPolizxcwsqUmml" token-validity-seconds="3600" data-source-ref="dataSource"/>
Run Code Online (Sandbox Code Playgroud)
设置令牌有效性是一个非常好的主意,您应该这样做。
授予
| 归档时间: |
|
| 查看次数: |
3364 次 |
| 最近记录: |