XilongPei / Openparts

MIT License
3 stars 1 forks source link

用户会话对应的UID需要缓存吗? #65

Open XilongPei opened 6 years ago

XilongPei commented 6 years ago

SimplePrincipalCollection pricipal = (SimplePrincipalCollection) session.getAttribute("org.apache.shiro.subject.support.DefaultSubjectContext_PRINCIPALS_SESSION_KEY"); 与 Redis中key = RedisConstant.SHIRO_SESSION_PRE + session.getId().toString()的字符串 是不是完全一致?

XilongPei commented 6 years ago

https://segmentfault.com/q/1010000012353160/a-1020000012378729 用户访问时,先查询session,如果已登录,再查uid是否存在 ,uid存在才认证成功。 如果担心性能问题,可把uid直接用本地内存或memcache等缓存起来(删除用户时同时清除缓存,缓存丢了就重新登录)

保存session时,建立与uid的映射, 比如: 如果session是存在关系数据库,那就 sid,session,将用户id作为session的值,那样,删除用户时就可以删除该用户的session 如果session存在文件或者redis之类, 可以在生成session时同时建立反向映射关系保存,目的也是当后台删除用户时可以找到对应用户的session来删除

XilongPei commented 6 years ago

SystemAuthorizingRealm.java 下面这个函数,会在用户session处于已经登录状态,再检查更多的用户是否还存在的信息。getRoleCodeSet() ...... protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals)

XilongPei commented 6 years ago

集成Shiro后当遇到404错误时会丢失session http://jinnianshilongnian.iteye.com/blog/1999182

XilongPei commented 6 years ago

shiro的sessionMode为native时,无法获得用户信息 https://www.oschina.net/question/733331_69042

不使用shiro的分布式session功能 Enumeration s=session.getAttributeNames(); 输出: org.apache.shiro.subject.support.DefaultSubjectContext_AUTHENTICATED_SESSION_KEY true org.apache.shiro.web.session.HttpServletSession.HOST_SESSION_KEY 127.0.0.1 org.apache.shiro.subject.support.DefaultSubjectContext_PRINCIPALS_SESSION_KEY yulei

使用shiro的分布式session功能 Enumeration s=session.getAttributeNames(); 输出: null!

修改菜单和权限以后将清空用户关联权限认证!