目录
前言
此篇只用来讲解shiro的基本使用,shiro用来进行权限管理
此篇较为简陋,是直接拿之前的笔记来凑的,后面会改进
shiro简介
给什么部门,角色赋予什么权限,删除什么权限,什么权限能显示什么东西
"权限"都是从数据库查出来的
每个父节点都是id为1的
常见的权限控制方式
我们点击取派员设置和删除的时候,都可以进行权限的校验
权限的类和表,打箭头的都是关键的
角色的类
用户类,打箭头的都是必要的,这些都是有对应关系的
在maven里引入shiro框架
引入all即可
单点登录
单点登录就是登录一个网站,然后打开第二个网站,第一个网站的用户信息会被第二个网站识别
比如 淘宝和天猫
搭建shiro框架
设置web.xml
在spring配置文件里
并且注入一些属性
注入3个页面,一个是登录页面,一个是首页,一个是提示权限不足的页面
安全管理对象填写默认的即可
注入url规则
authc是简写,这个才是真正的url过滤器
/**就是代表一切的请求都有authc处理
authc是用来检查你是否已经登录了,如果登录了,没有就跳转到登录页面
登录页面的地址我们在上面已经配置了,那个loginUrl就是
anon是anonymous匿名的,也就是没有登录的也能访问
为什么是2个*,因为可能有多级目录,而用2个*就不管有几层目录了
而jsp后面的*,因为是拦截url,所以后面肯定会加参数,所以用jsp*,代表后面还要匹配0个或多个
perms是代表允许的权限,就是说当前用户是否有 staff-list权限,如果有,就可以访问base_staff.acton
如果没有就跳转到没有权限的页面,相当于是配置方式配置权限,下面有注解方式
最下面的就代表,如果上面的都没匹配到,那么由它来匹配到
测试登录功能,发现登录成功后直接跳回了登录页面
那是我们登录只是在数据库认证了,但是并没有告诉shiro你已经登录成功了
所以需要修改下action里,蓝色部分全部删掉
token里就带了我们提交的用户名和密码
直接就是login,判断是否登录的,但这是shiro的,并不是我们自己的dao方法
所以需要让数据库和这个联系起来
创建一个realm(范围,部门)包,和service是同级的
继承这个类,这是个抽象类
现在就可以补全上面的安全管理器了,安全管理器内部有 setRealm(父类里)
如果这里返回null就代表认证失败,我们可以在这里调用dao,这个箭头指向的token是我们上面封装了帐号密码的tooken
把dao注入进来
\
如果用户名存在,就认证
这个是简单认证,第一个传入user对象,action里会用到,第二个传入密码,第3个是字符串,写什么都可以,这里填入本类的类名
shiro负责对比密码是否一致
修改下action,应该把打印异常的用错误信息代替,比如用户名不存在
下面的就是获取我们从BosRealm传过来的user,然后存到页面上去,这时候就代表登录成功了
现在我们随便访问一个链接,比如职员列表,发现提示权限不足,因为我们没有给当前用户赋予staff-list的权限
授权,这里后期应该修改为根据当前用户,查询对应的权限,然后全部授权
上面我们自己写了一个Realm,框架其实提供了一个自带的,但是框架自带的,里面有自带的sql语句
这个语句是jdbc模版的语句,而我们是ssh和ssm框架,所以使用我们自己写的
注解方式的权限控制
开启注解
必须使用cglib方式为action创建代理对象,是基于继承来实现的(百度下cglib和jdk代理的区别,我们之前的笔记也有写过)
简单的来说,就是如果使用jdk创建代理对象,因为是基于接口的,我们的action实现的是ModelDriven,用来获取页面接受的数据的
所以会创建ModelDriven的代理对象,而这个对象里面没有我们的方法,我们的方法是写在baseAction里的,而baseAction是继承的
cglib是基于继承的,所以必须用这个
目前把proxtyTargetClass改为ture即可
配置切面,让spring创建切面类,shiro才能增强对应的方法赋予其权限
测试
只要访问了这个方法就会去判断权限,在Realm里
而权限的授权是在Realm里
我们配置了权限之后,删除数据便会提示未授权异常,我们应该把这个异常换成对应的文字,如 无权限
定义全局结果集捕捉异常
还需要定义全局异常映射
页面标签的方式进行权限控制
引入shiro标签
加了权限的标签打开页面默认是不显示的,除非有对应的权限
要让页面不显示删除按钮,虽然不显示,但却可以直接在地址栏去访问对应的链接 delete_xxx.action
一般来说,标签权限控制只是为了不让你看到,后台同样需要写权限控制
权限的管理
添加权限
这个类也就是权限类
这里我们把编号可以改成关键字,也就是code字段,而真正的id使用uuid进行自动生成
是否生成菜单,也就是是否在左边的导航栏显示
优先级,我们每次查询出菜单其实都会排序zindex
这样才能保证菜单每次打开都是这个顺序
访问路径
父功能点,对应的就是pid
这个下拉框就是展示所有权限的,不是必选项
获取下拉数据
保存权限
因为不生成菜单,所以优先级可以随便写
这里添加权限,
添加角色
角色就是集多个权限为一身的代表
使用easyUI提供的方法获取节点数组
上面权限那里点开了,会有很多权限
写服务端
ehcache缓存权限数据
我们每次点击对应的页面,都会去相应的授权(因为过滤器),这样sql的查询过于频繁,所以需要用到缓存
在maven里引入
在安全管理器里面就已经有了缓存管理器,只需要把ehcache注入进去即可
缓存管理作用在权限部分
这是ehcache的配置文件
第1个是最大对象数1W个
eternal是是否永久有效,改成false代表有生命周期
第3个是空闲时间,程序没有被使用2个分钟, 就会把数据清理
第4个是存活时间
第5个是 溢出到磁盘,因为最大对象数1W,但是可能会多出来,多出来的就放到磁盘上
第6个是放到磁盘上的最大数
第7个是磁盘持久化,如果是false,假如tomcat重启了,那存到磁盘上的数据就不要了,因为是缓存的数据,所以可以丢了
第8个是线程轮询时间,会隔120秒检测是否有数据需要清理
第9个是淘汰策略,LRU是最近一个段时间用的最少的就清理掉,还有一个fifo,是先进先出,就是最先的对象最先清理了,按时间清理
在spring配置文件配置
注入到安全管理器里
此时如果我们退出了, 也就是退出认证(帐号),这时候缓存也会消失,需要重新认证和授权