Shiro Security是非常不错的Security框架
最近在我的项目中进行相关整合,shiro不难,难就难在如何对已经成熟的系统进行整合
作为相关切入点,我也考虑了很久,整体运用上了如张开涛大佬所说
对于Subject我们一般这么使用:
1、身份验证(login)
2、授权(hasRole*/isPermitted*或checkRole*/checkPermission*)
3、将相应的数据存储到会话(Session)
4、切换身份(RunAs)/多线程身份传播
5、退出
回归标题,正常整合过后,基本可以正确的进行登录与登出
那么开始进行细节休整
大体介绍我们的系统架构是springmvc进行开发,一个项目里分出了两套系统,系统与系统间的区分仅仅只是 通过url路径上的不同,来表现。那么现在就出现了一种情况,系统1基本用户都能登入,而系统2却只有相关权限人才能登入。
表面上视乎能在登陆上做控制,比如login的时候通过权限判断就可以做到。那么这时候考虑的是如果用户之间通过url强行进入呢。
比如系统1用户登录,直接修改url进入系统2。此时属于非法访问。
正常我们会在filter内做过滤,也好做,在相关登录逻辑内对session赋予标记,在filter做过滤就over了,不符合直接logout。
想到这里,作为一个shiro框架使用者是不是感觉shiro貌似没起作用。
于是思考一个比较合理的方案,于是决定当用户登陆系统时,对sessionid进行赋值,系统1则在sessionid前+上相关字符串标记session为系统1用户。系统2则在sessionid前+上相关字符串标记session为系统2用户。
需求清晰,那么进行可行性分。
那么结合shiro中的session管理,开始做起了调查。
首先进行是的shiro如何修改sessionid,这能找却不能满足我的需求。因为市面上的他们都是以单系统,或者双项目双系统进行写的。完全不能符合我想要的。
一般都是这么做的
**
**
上面的解决方案是对不同项目进行不同的jsessionid名的配置
但我一个项目里怎么可能出现两个shiro,不符合我的要求
于是考虑shiro内置处理session我要做点手脚。
首先是查到了sessionid生成器
自定义了一个id生成器
public class SysSessionIdGenerator implements SessionIdGenerator {
@Override
public Serializable generateId(Session session) {
if(session.getAttribute("sysType")!=null){
return session.getAttribute("sysType").toString()+"_"+UUID.randomUUID().toString();
}
return UUID.randomUUID().toString();
}
}
主要实现SessionIdGenerator generateId的方法。这里可以看见我吧sysType加到uuid前面。
然后就是注入给shiro使用
配置需要加入
sessionDAO 也要记得注入给 sessionManager 这里我就不写了
那么问题又来了,逻辑上不上应该生成session的时候调用吗,那么shiro的session是在什么时候生成的呢。
我翻了翻源码
subject.getSession()
这个get方法实现的