zoukankan      html  css  js  c++  java
  • 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>

  • 相关阅读:
    Nand flash uboot 命令详解【转】
    uboot命令分析+实现【转】
    UBoot常用命令手册
    第一个Linux驱动-流水灯【转】
    lcd ram/半反穿技术解析【转】
    使用 .gitignore来忽略某些文件【转】
    git常见操作--忽略文件以及常用命令【转】
    Git忽略文件方法【转】
    Git查看、删除、重命名远程分支和tag【转】
    SPA与DPA 攻击【转】
  • 原文地址:https://www.cnblogs.com/rodge-run/p/6477439.html
Copyright © 2011-2022 走看看