一  基于注解方式的权限控制

首先, 在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缓存的更多相关文章

  1. Apcahe Shiro学习笔记(二):通过JDBC进行权限控制

    一.概述: 官方对Realm(领域)的描述:https://www.infoq.com/articles/apache-shiro 其功能本质上是一个安全特定的DAO,用于链接数据持久层(任何形式的都 ...

  2. SpringMVC入门(基于注解方式实现)

    ---------------------siwuxie095                             SpringMVC 入门(基于注解方式实现)         SpringMVC ...

  3. Spring Boot + Spring Cloud 实现权限管理系统 后端篇(二十四):权限控制(Shiro 注解)

    在线演示 演示地址:http://139.196.87.48:9002/kitty 用户名:admin 密码:admin 技术背景 当前,我们基于导航菜单的显示和操作按钮的禁用状态,实现了页面可见性和 ...

  4. Spring boot 基于注解方式配置datasource

    Spring boot 基于注解方式配置datasource 编辑 ​ Xml配置 我们先来回顾下,使用xml配置数据源. 步骤: 先加载数据库相关配置文件; 配置数据源; 配置sqlSessionF ...

  5. Elasticsearch-mapper 基于注解方式生成mapping(2.0以上)

    Elasticsearch生成mapping的方式上有多种方式,我们可以把mapping做成配置文件,也可以用spring-data-elasticsearch基于注解生成. 在基于注解生成这种方式上 ...

  6. Spring声明式事务管理(基于注解方式实现)

    ----------------------siwuxie095                                 Spring 声明式事务管理(基于注解方式实现)         以转 ...

  7. Spring中基于注解方式管理bean

    操作步骤 第一步:导入相关jar包 spring IoC的基本包 Spring支持注解的Jar包 第二步:创建Spring配置文件,ApplicationContext.xml 引入约束和开启注解扫描 ...

  8. Struts2中基于Annotation的细粒度权限控制

    Struts2中基于Annotation的细粒度权限控制 2009-10-19 14:25:53|  分类: Struts2 |  标签: |字号大中小 订阅     权限控制是保护系统安全运行很重要 ...

  9. 使用Spring框架入门四:基于注解的方式的AOP的使用

    一.简述 前面讲了基于XML配置的方式实现AOP,本文简单讲讲基于注解的方式实现. 基于注解的方式实现前,要先在xml配置中通过配置aop:aspectj-autoproxy来启用注解方式注入. &l ...

随机推荐

  1. SMO

    序列最小优化算法(英语:Sequential minimal optimization, SMO)是一种用于解决支持向量机训练过程中所产生优化问题的算法.SMO由微软研究院的约翰·普莱特(John P ...

  2. 《java入门第一季》之面向对象面试题(继承中构造方法的关系)

    /* 继承中构造方法的关系 A:子类中所有(子类的有参和无参)的构造方法(默认都会访问父类)中(空参数)的构造方法,默认访问父类空参数构造,不默认访问有参数构造 B:为什么呢? 因为子类会继承父类中的 ...

  3. 仿百度壁纸客户端(一)——主框架搭建,自定义Tab+ViewPager+Fragment

    仿百度壁纸客户端(一)--主框架搭建,自定义Tab+ViewPager+Fragment 百度壁纸系列 仿百度壁纸客户端(一)--主框架搭建,自定义Tab + ViewPager + Fragment ...

  4. Cocoa公历和中国农历直接的转换

    看过某书上面的做法是先生成一个公历的calendar,使用的是: NSCalendar *cal = [NSCalendar currentCalendar]; 然后用它生成一个NSDateCompo ...

  5. Oracle EBS ERP中月结年结的流程总结

    月结与年结处理,是企业财务比较特殊而重要的业务操作.在实施与推广OracleERP系统过程中,如何结合现行的会计制度与惯例,充分利用软件功能,做好相应的关账.开账工作,是困扰许多企业财务人员乃至实施顾 ...

  6. 根据Facebook内存的管理使用,浅谈在iOS上自动检测内存泄漏问题

    分装库下载:https://github.com/facebook/FBMemoryProfiler FBMemoryProfiler类库使用教程:http://ifujun.com/fbmemory ...

  7. UML类图的简单梳理

    依赖关系 Dependency Class Car{} Class Person{ int a; static int b public void buy(Car c){ int c; .... } ...

  8. LeetCode(62)-Two Sum

    题目: Given an array of integers, return indices of the two numbers such that they add up to a specifi ...

  9. DTN学习,theONE模拟器网络相关资料整理

    下面是一个百度空间的: http://hi.baidu.com/jensenliao 博客园的一篇博客:theONE模拟器简介(主要讲述,软件配置,软件结构) http://www.cnblogs.c ...

  10. redis简单主从复制

    两台ubuntu 云服务器,分别redis主从服务器,ip地址是:123.207.96.138(主)139.199.167.251(从) 安装redis,在这里我建议给redis设置密码,之前看过一篇 ...