zoukankan      html  css  js  c++  java
  • Shiro授权

    授权流程

    三种授权方法

    Shiro 支持三种方式的授权:

       编程式:通过写if/else 授权代码块完成:

    Subject subject = SecurityUtils.getSubject();

    if(subject.hasRole(“admin”)) {

    //有权限

    } else {

    //无权限

    }

      注解式:通过在执行的Java方法上放置相应的注解完成:

    @RequiresRoles("admin")

    public void hello() {

    //有权限

    }

      JSP/GSP 标签:在JSP/GSP 页面通过相应的标签完成:

    <shiro:hasRole name="admin">

    <!— 有权限—>

    </shiro:hasRole>

    shiro-permission.ini

    shiro-permission.ini里边的内容相当于在数据库。

    权限标识符号规则:资源:操作:实例(中间使用半角:分隔)

    usercreate:01  表示对用户资源的01实例进行create操作。

    user:create:表示对用户资源进行create操作,相当于user:create:*,对所有用户资源实例进行create操作。

    user*01  表示对用户资源实例01进行所有操作。

    程序编写

        @Test
        public void test1() {
    
        Factory<SecurityManager> factory=new IniSecurityManagerFactory("classpath:config/shiro-permission.ini");
        
        SecurityManager securityManager=factory.getInstance();
        
        SecurityUtils.setSecurityManager(securityManager);
        
        Subject subject=SecurityUtils.getSubject();
        
        UsernamePasswordToken token=new UsernamePasswordToken("zhangsan", "123");
        
        try {
    //        登录
            subject.login(token);
        } catch (AuthenticationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    //    认证状态
        System.out.println("认证状态:"+subject.isAuthenticated());
        
    //    认证通过后授权
    //    基于角色的授权
    //    hasrole传入角色标识
        boolean ishasRole=subject.hasRole("role1");
        System.out.println("单个角色判断"+ishasRole);
        
        boolean ishasAllRole=subject.hasAllRoles(Arrays.asList("role1","role2"));
        System.out.println("多个角色判断"+ishasAllRole);
    //    使用check方法进行授权,若授权不通过会抛出异常
    //    subject.checkRole("role3131");    
    //    基于资源的的授权
    //    isPermitted传入资源标识符
        boolean isPermitted=subject.isPermitted("user:create");
        System.out.println("单个资源判断:"+isPermitted);
        
        
        boolean isPermittedAll=subject.isPermittedAll("user:create","user:update");
        System.out.println("多个资源判断:"+isPermittedAll);
        
    //    使用check方法进行授权,若授权不通过会抛出异常
        subject.checkPermission("items:create:1");
        
        }
    View Code

    自定义realm进行授权

     需求

    上边的程序通过shiro-permission.ini对权限信息进行静态配置,实际开发中从数据库中获取权限数据。就需要自定义realm,由realm从数据库查询权限数据。

    realm根据用户身份查询权限数据,将权限数据返回给authorizer(授权器)。

     自定义realm

    在原来自定义的realm中,修改doGetAuthorizationInfo方法。

    shiro-realm.ini

    在shiro-realm.ini中配置自定义的realm,将realm设置到securityManager中。

    测试程序

    授权流程

    1.对subject进行授权,调用方法isPermitted(“permission串”)

    2.SecurityManager执行授权,通过ModularRealmAuthrizer执行授权

    3.ModularRealmAuthrizer执行realm(自定义的CustomRealm)从数据库查询权限数据

     调用realm的授权方法:doGetAuthorizationInfo

    4.realm从数据库查询权限数据,返回ModularRealmAuthrizer

    5.ModularRealmAuthrizer调用PermissionResolver进行权限串比对

    6.如果比对后,isPermitted"permission"realm查询到权限数据中,说明用户访问permission串有权限,否则 没有权限,抛出异常

     

  • 相关阅读:
    Android 媒体存储服务(二)
    Android 媒体存储服务(一)
    MTP in Android详解
    Source Insight 常用设置和快捷键大全
    Android 中onSaveInstanceState和onRestoreInstanceState学习
    Android RadioButton 语言无法切换问题
    Android 中onConfigurationChanged问题
    欢迎访问我的CSDN博客
    Java-异常
    Java-finally相关问题
  • 原文地址:https://www.cnblogs.com/lxc116317/p/9419021.html
Copyright © 2011-2022 走看看