此时我完全不知道Shiro“rememberMe”服务应该如何运作。
我正在使用Shiro和我的应用程序,该应用程序托管在Google App Engine上。
我在 appengine-web.xml 文件中将会话启用设置为 TRUE 。
我可以看到登录我的应用程序时创建的“rememberMe”cookie。 关闭浏览器并重新打开后,我还可以找到Cookie(在Chrome>设置> Cookie中)。 所以cookie显然就在那里。
我的登录代码基本上如下使用基于表单的登录...
UsernamePasswordToken token = new UsernamePasswordToken( email, password );
token.setRememberMe(true);
theSubject.login(token);
如果身份验证成功,我会查询用户对象。
问题是当我关闭浏览器并重新访问该网站时,调用: SecurityUtils.getSubject()。isRemembered() 总是“假的”。
我在这里做错了什么?
答案 0 :(得分:0)
似乎我总是在发布后总结出事情。 :)
问题是“rememberMe”cookie的大小。 我让Shiro将整个User对象序列化为cookie。
经过大量搜索,我发现虽然确实会设置cookie,但如果cookie太大(大于4K),浏览器将忽略它并且不会在响应中发送它。
我现在改变了事情,只是在cookie中序列化用户密钥(作为Web安全字符串)。然后,我可以在每个请求上访问密钥。
另一个改变......
用户登录后,我在会话中设置用户以便于检索。 显然这不是最好的做法。
我现在只在会话中设置用户密钥。
我现在可以从cookie或会话(登录后)访问用户密钥,并在需要时查询用户(及相关数据)。
如果有人有其他建议或更好的想法,请随时发布。 我总是愿意学习。 :)