shiro前后台的session会共用一个,怎么分开?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shiro前后台的session会共用一个,怎么分开?相关的知识,希望对你有一定的参考价值。
问题是这样的,在一个web工程里面,要同时实现前台登录和后台登陆,这一功能目前已经通过自定义多个realm实现了。同时前后台用户分别存储在不同的数据库表里。
但是接下来遇到了一个新的问题,前后台同时登录的话,session会共用一个,导致帐号被顶或者一方退出登录就前后台都退出了。我认为解决这个问题的思路,应该是:前后台登陆以后,分别创建不同的session,但是现在我遇到一个问题,我找不到在哪里创建session,或者有可能我找到了地方,但是我没有成功的控制他们加以区分。
网上查了一下,session是Subject currentUser = SecurityUtils.getSubject()这样直接获取到的,可以理解成是currentUser的一个属性,那么理论上来说,我前后台登录调用的是不同的方法,查询的是不同的数据表,那么session应该是不一样啊,但是加断点发现,两个session一模一样。
1、力推 Filter 过滤器,
2、后台判断根据权限跳转页面
登陆成功后获取 Subject 对象.
然后通过 Subject 对象来判断当前用户的角色/权限,之后执行不同的跳转(直接在LoginAction中做).
如果我的回答没帮助到您,请继续追问。追问
后台确实已经是通过权限跳转页面了
以前台举例来说,首先是前台验证的realm
setSession("user", uservo);// 将用户信息放入session
然后在配置的intercepter对应的perHandle方法中:
Object objUser = session.getAttribute("user");
后台对应的就是“admin”这么一个key,但是并没有影响到session
session存储redis但是对应用透明,项目前后端分离,使用shiro做权限管理的关于session知识点整理
做项目是web的,并且会有移动设备,以及未来会进行分布式部署,所以shiro作为权限管理的时候,就会出现session和应用分离的状况。
因为redis集成在了session中,所以session对shiro项目来说是透明的,这时,就需要前端能保存jsessionid来对项目进行请求的时候不需要再重新登录。
因为session存在redis,对我们是透明的,然后shiro关于sessionManager使用的是默认的配置,并没有对SessionDao进行重写。
然后就是前端携带jsessionId向后端请求了。
有两种方式,cookie和request header。
一般情况下,shiro在web端可以直接生成cookie,请求的时候,shiro默认获取cookie中的jsessionid,然后验证通过,调用业务接口。
在二般情况下呢,cookie被禁止。这时,request header就派上用场了。shiro会解析header的key/value值,所以这时间就可以让前端以cookie:JSESSIONID=XXXXXX的形式向应用请求。
下面是在postman中验证的过程(时间问题,不贴图了,只做过程描述):
postman中调用应用的登录接口,就会生成session,将jsessionid存储在cookies,这时header是没有cookie这个属性的。调用业务接口,可以成功。然后我们把浏览器的cookie禁止掉,这时,再调用业务接口,就获取不到jsessionid,也就无法获得session,然后我们把刚才cookie的值放在header中,再次调用业务接口,成功了。并且,测试过程中,把cookie打开,浏览器cookie设置jsessionid为id1,header的cookie设置为jsessionid=id2,此时调用接口获取session,返回的sessionid为id1,所以shiro是默认先获取浏览器的cookie的jsessionid,然后没有浏览器cookie的话,再去查找header的cookie参数的jsessionid的。
总结,登录成功后将sessionid返回给前端,让前端记录。登陆后前端每次请求接口时,默认设置header的cookie的值jsessionid。这样子第一,不用考虑浏览器是否禁用cookie,其次,满足除了web浏览器之外,移动设备(手持设备)、分布式部署、前后端分离的情况都可以满足。再者,session方面的配置使用shiro的默认设置即可。
PS,应用的HttpServletSession启动时候就集成redis这个是我们架构师做的,详细的原理我还没了解,暂时不提供解释。上面的方式就是针对目前这类项目(session存储redis但是对应用透明,项目前后端分离,使用shiro做权限管理)的设计做的对策。
PPS,shiro的session.create底层还是httpServletRequest的HttpSession,参考springmvc集成shiro后,session、request姓汪还是姓蒋?
以上是关于shiro前后台的session会共用一个,怎么分开?的主要内容,如果未能解决你的问题,请参考以下文章
session存储redis但是对应用透明,项目前后端分离,使用shiro做权限管理的关于session知识点整理
springboot shiro 前后端分离,解决跨域过虑options请求shiro管理session问题模拟跨域请求