Shiro入门之二 --------基于注解方式的权限控制与Ehcache缓存
一 基于注解方式的权限控制
首先, 在spring配置文件applicationContext.xml中配置自动代理和切面
<!-- 8配置自动代理 -->
<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator">
<!-- 指定使用cglib动态代理, 因为jdk动态代理只是针对接口实现的 -->
<property name="proxyTargetClass" value="true"></property>
</bean>
<!-- 9配置切面 -->
<bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor"></bean>
然后, 在具体需要进行权限控制的方法上添加@RequiresPermissions("staff-delete")注解
@RequiresPermissions("staff-delete")
public String deleteOrRestore () {
//获取用户时删除还是还原功能
String flag = model.getDeltag();
//拆分ids, 获取id数组
String[] idArray = ids.split(",");
if ("1".equals(flag)) {
//调用业务层, 批量删除
staffService.delete(idArray);
} else {
//调用业务层, 批量还原
staffService.restore(idArray);
}
return "list";
}
最后, 如果在struts中编写了通用的action即baseAction类, 则需要修改baseAction中的构造方法
//通过无参构造方法,在对象初始化的时候创建model
@SuppressWarnings({ "rawtypes", "unchecked" })
public BaseAction() {
//1.获取当前类的字节码
Class<? extends BaseAction> clazz = this.getClass();
//2.通过当前类的字节码获取父类的类型
Type genericSuperclass = clazz.getGenericSuperclass();
//3.将父类的类型强转为parameterizedType
ParameterizedType parameterizedType = null;
/*
* 由于在权限校验中使用了cglib动态代理, 所以this.getgenericSuperClass()获取的不一定是baseaction中的参数化类型
* 不一定能强转,因此需要进一步判断和处理
*/
//3.1首先判断genericSuperclass是否是ParameterizedType的父类,
if (genericSuperclass instanceof ParameterizedType) {
//3.2如果是,则可以强转
parameterizedType = (ParameterizedType) genericSuperclass;
} else {
//3.3如果不是,则说明使用cglib动态代理,则genericSuperclass是实际调用的baseaction的子类,如UserAction等,则需要获取UserAction的父类,然后转换
parameterizedType = (ParameterizedType) this.getClass().getSuperclass().getGenericSuperclass();
}
//4.根据parameterizedType获取当前对象的类型
Type[] actualTypeArguments = parameterizedType.getActualTypeArguments();
//5.强当前对象类型强转为class对象
Class<T> modelClass = (Class<T>) actualTypeArguments[0];
//为detachedCriteria赋值
detachedCriteria = detachedCriteria.forClass(modelClass);
pageBean.setDetachedCriteria(detachedCriteria);
//6.根据class对象利用反射创建实体类
try {
model = modelClass.newInstance();
} catch (InstantiationException | IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
二 Ehcache缓存在Shiro权限控制中的应用
在Shiro权限认证中, 每次访问特定权限的区域时, 都会调用Shiro安全管理器进行权限认证和授权, 并且还会与数据库进行交互, 这样势必导致程序运行的速率比较地下. 为此, 引入Ehcache缓存进行权限数据的缓存, 在用户第一次登陆授权完成之后, 将用户的权限保存在缓存中, 以后再访问需要授权的模块时, 则直接从缓存中获取该用户对应的权限即可.
首先, 将Ehcache的jar包导入到项目中
其次, 将Ehcache缓存jar包解压, 获取ehcache-failsafe.xml文件,将其改名为ehcache.xml并配置在src根目录下
最后, 在spring配置文件中配置缓存管理器, 并将其注入给安全管理器
<!-- 7配置Shiro的安全管理器 -->
<bean name="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<!-- 注入realm -->
<property name="realm" ref="bosReal"></property>
<!-- 注入缓存管理器 -->
<property name="cacheManager" ref="ehCacheManager"></property>
</bean>
<bean id="bosReal" class="cn.rodge.bos.shiro.BOSRealm"></bean>
<!-- 10配置Ehcache缓存管理器 -->
<bean id="ehCacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager">
<property name="cacheManagerConfigFile" value="classpath:ehcache.xml"></property>
</bean>
三 使用Shiro标签, 根据权限展示页面数据
首先, 在页面中引入Shiro标签库
<%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags" %>
然后, 在对应的权限工具上添加权限控制的标签
<shiro:hasPermission name="staff">
{
id : 'button-delete',
text : '作废',
iconCls : 'icon-cancel',
handler : doDelete
},
</shiro:hasPermission>
Shiro入门之二 --------基于注解方式的权限控制与Ehcache缓存的更多相关文章
- Apcahe Shiro学习笔记(二):通过JDBC进行权限控制
一.概述: 官方对Realm(领域)的描述:https://www.infoq.com/articles/apache-shiro 其功能本质上是一个安全特定的DAO,用于链接数据持久层(任何形式的都 ...
- SpringMVC入门(基于注解方式实现)
---------------------siwuxie095 SpringMVC 入门(基于注解方式实现) SpringMVC ...
- Spring Boot + Spring Cloud 实现权限管理系统 后端篇(二十四):权限控制(Shiro 注解)
在线演示 演示地址:http://139.196.87.48:9002/kitty 用户名:admin 密码:admin 技术背景 当前,我们基于导航菜单的显示和操作按钮的禁用状态,实现了页面可见性和 ...
- Spring boot 基于注解方式配置datasource
Spring boot 基于注解方式配置datasource 编辑 Xml配置 我们先来回顾下,使用xml配置数据源. 步骤: 先加载数据库相关配置文件; 配置数据源; 配置sqlSessionF ...
- Elasticsearch-mapper 基于注解方式生成mapping(2.0以上)
Elasticsearch生成mapping的方式上有多种方式,我们可以把mapping做成配置文件,也可以用spring-data-elasticsearch基于注解生成. 在基于注解生成这种方式上 ...
- Spring声明式事务管理(基于注解方式实现)
----------------------siwuxie095 Spring 声明式事务管理(基于注解方式实现) 以转 ...
- Spring中基于注解方式管理bean
操作步骤 第一步:导入相关jar包 spring IoC的基本包 Spring支持注解的Jar包 第二步:创建Spring配置文件,ApplicationContext.xml 引入约束和开启注解扫描 ...
- Struts2中基于Annotation的细粒度权限控制
Struts2中基于Annotation的细粒度权限控制 2009-10-19 14:25:53| 分类: Struts2 | 标签: |字号大中小 订阅 权限控制是保护系统安全运行很重要 ...
- 使用Spring框架入门四:基于注解的方式的AOP的使用
一.简述 前面讲了基于XML配置的方式实现AOP,本文简单讲讲基于注解的方式实现. 基于注解的方式实现前,要先在xml配置中通过配置aop:aspectj-autoproxy来启用注解方式注入. &l ...
随机推荐
- java工具类(三)之生成若干位随机数
java 生成若干位随机数的问题 在一次编程的过程中偶然碰到一个小问题,就是需要生成一个4位数的随机数,如果是一个不到4位大的数字,前面可以加0来显示.因为要求最后是一个4位的整数,不带小数点.当时就 ...
- android 面试之listview
ListView优化一直是一个老生常谈的问题,不管是面试还是平常的开发中,ListView永远不会被忽略掉,那么这篇文章我们来看看如何最大化的优化ListView的性能.· 1.在adapter中的g ...
- GRUB与Linux系统修复(第二版)
GRUB配置解析 配置文件保存在 /boot/grub/grub.conf[/boot分区最好应该单独划分出来] 软链接保存在 /etc/grub.conf 1.grub.conf文件分析 defau ...
- 我所理解的Android 启动模式
首先,这是从 一个开源网站转载的,觉得写得不错,对我们之前理解的activity的启动模式是一个新的理解方式,并给出实际的应用场景. 任务栈是什么 任务栈Task,是一种用来放置Activity实例的 ...
- LIRe 源代码分析 4:建立索引(DocumentBuilder)[以颜色布局为例]
===================================================== LIRe源代码分析系列文章列表: LIRe 源代码分析 1:整体结构 LIRe 源代码分析 ...
- 初涉IPC,了解AIDL的工作原理及使用方法
初涉IPC,了解AIDL的工作原理及使用方法 今天来讲讲AIDL,这个神秘的AIDL,也是最近在学习的,看了某课大神的讲解写下的blog,希望结合自己的看法给各位同价通俗易懂的讲解 官方文档:http ...
- Volley网络框架完全解析(实战篇)
好了,今天就通过一个瀑布流demo,来使用Volley框架请求网络图片. 前言: 我们使用NetworkImageView显示图片: 1.因为该控件可以自动的管理好请求的生命周期,当与父控件detac ...
- SoC嵌入式软件架构设计
内存是SoC(System on Chip,片上系统)集成设计的重要模块,是SoC中成本比重较大的部分.内存管理的软硬件设计是SoC软件架构设计的重要一环,架构设计师必须要在成本和效率中取得平衡,做到 ...
- obj-c编程15[Cocoa实例04]:基于Core Data的多文档程序示例[未完待续]
上一个例子我们使用的模式数据实际上是基于一个Person数组,现在我们看一下如何使用Cocoa中的Core Data框架支持,几乎不用写一行代码,完成模式数据的建立. 我们这里模式的元素使用的是Car ...
- 修改input属性placeholder的样式
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

