• 项目一:第十二天 1、常见权限控制方式 2、基于shiro提供url拦截方式验证权限 3、在realm中授权 5、总结验证权限方式(四种) 6、用户注销7、基于treegrid实现菜单展示


    课程计划

    1、 常见权限控制方式

    2、 基于shiro提供url拦截方式验证权限

    3、 realm中授权

    4、 基于shiro提供注解方式验证权限

    5、 总结验证权限方式(四种)

    6、 用户注销

    7、 基于treegrid实现菜单展示

    常见的权限控制方式

    2.1 url拦截实现权限控制

    shiro基于过滤器实现的

     

    2.2 注解方式实现权限控制

    底层:代理技术

     

     

    基于shirourl拦截方式验权

     

     

    <!-- 配置过滤器工厂 -->

    <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">

    <!-- 注入安全管理器 -->

    <property name="securityManager" ref="securityManager"></property>

    <!-- 注入相关页面

    loginUrl :登陆页面=用户没有登录,访问某个url(要求当前用户登陆后可见)shiro框架跳转登录页

        successUrl;登陆成功页面=可以不配(通过struts2框架跳转)

        unauthorizedUrl;权限不足页面=用户登陆后访问url(要求必须有某个权限),如果用户没有权限,跳转此页面

     -->

    <property name="loginUrl" value="/login.jsp"></property>

    <property name="unauthorizedUrl" value="/unauthorized.jsp"></property>

    <!-- 配置过滤器链:配置项目中url对应拦截规则(怎么验权) -->

    <!--

    等号左侧代表项目url    /** 项目中所有url

    等号右侧代表url经过哪个过滤器(shiro框架提供,使用简称即可)

    authc:表单认证过滤器(访问url,要求当前用户必须认证通过后才有权限访问)

    anon:匿名过滤器(访问url,不需要登陆,不需要有权限==直接放行)

    perms:权限授权过滤器(访问url,要求当前用户必须有某个权限)

    roles:角色授权过滤器(访问url,要求当前用户必须有某个角色)

     -->

    <property name="filterChainDefinitions">

    <value>

    /js/** = anon

    /images/** = anon

    /css/** = anon

    /login.jsp = anon

    /validatecode.jsp* = anon

    /userAction_login.action = anon

    /pages/base/standard.jsp = perms["standard_page"]

    <!-- /courierAction_delete.action = perms["courier_delete"] -->

    /pages/base/courier.jsp = roles["admin"]

    /** = authc

    </value>

    </property>

    </bean>

    访问:使用权限过滤器perms 拦截到用户请求后,而当前用户没有任何权限

     

    realm中授权

    通过url控制权限:当某个请求需要进行权限校验,角色校验时候,安全管理器会调用reaml中授权的方法;获取用户角色,以及权限。

     

    /**

      * @Description: 给用户进行授权

    */

    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {

    System.out.println("给用户授权");

    //获取当前用户

    User user = (User) SecurityUtils.getSubject().getPrincipal();

    //数据库结构 用户-角色:多对多  角色-权限:多对多  可以根据用户id查询用户权限

    //TODO 给用户授权只能是硬编码  ,后期改为查询数据库

     

    //创建简单授权信息(包含当前用户对应的权限,角色)

    SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();

    //添加权限标识,注意这里不能添加空白权限

    //跟过perms滤器中,要求权限标识一样

    info.addStringPermission("courier_page");

    info.addRole("admin");

    return info;

    }

     

    基于shiro的注解方式验权

     

     

    1.1 开启shiro注解支持

    <!-- 开启shiro注解支持 -->

    <!--

    自动代理:自动根据情况不同选择代理技术

    有接口:使用jdk动态代理==产生实现类代理对象

    没有接口:使用cglib动态代理==产生子类代理对象

    设置自动代理:强制使用cglib动态代理产生代理对象==如果使用自动代理使用jdk动态代理。产生对象为null -->

    <bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator">

    <property name="proxyTargetClass" value="true"></property>

    </bean>

     

    <!-- 配置验权切面:通知/增强(扩展功能代码:验证权限)+切点(shiro注解所在方法) -->

    <bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor"></bean>

     

     

    1.2 Service中方法上使用shiro注解

     

     

    验证当前用户是否有权限,当没有权限时候,shiro框架抛出异常;

    解决:在Realm中给用户进行授权;给当前用户增加权限即可

     

     

     

     

     

    1.3 使用struts2框架处理异常信息

     

     

     

     

     

     

     

     

    总结权限控制方式

    1、 url拦截:底层基于过滤器;在spring容器中配置过滤器链,配置项目中url对应拦截规则,注意:配置顺序

     

     

     

    2、 注解方式:底层基于动态代理

    a) 第一步开启shiro注解扫描 注意:强制使用cglib方式;事务注解也要使用cglib方式

    b) 第二步:service层中方法上使用shrio注解

    3、 Shiro页面标签控制

    <%@ taglib uri="http://shiro.apache.org/tags" prefix="shiro"%>

     

     

    4、 代码级别

     

     

    Shiro框架应用

    基于shiro框架实现用户注销

    1、 修改index.jsp页面退出时的请求地址

     

     

    2、 Action中提供logout方法

     

     

     

    菜单的查询

    项目部署后,菜单数据,通过sql脚本直接添加到数据库中。

     

    菜单表自关联;

     

    1.1 treeGrid展示菜单数据

     

     

    Treegrid要求的数据格式

     

     

    1、 页面:pages/system/menu.jsp

     

    2、 创建菜单三层对象-完成注入 –

    3、 问题一:由于要求返回json包含children 并且方式 出现No-session

     

    4、 解决:将子节点数据立即加载

     

    5、 json数据时候死循环

     

    6、 问题:重复数据

    Servie:

     

     

  • 相关阅读:
    mysql 触发器
    Yii 1.0 基础
    python解释执行原理(转载)
    python中使用selenium调用Firefox缺少geckodriver解决方法
    Python中os和shutil模块实用方法集锦
    pytesseract使用
    anaconda安装第三方库
    anaconda spyder异常如何重新启动
    windows下python3.6 32bit 安装django
    设置SO_RECVBUF和SO_SENDBUF套接字选项
  • 原文地址:https://www.cnblogs.com/shan1393/p/9250720.html
Copyright © 2020-2023  润新知