Shiro实战学习笔记(3)- 授权

2023-10-27

1 授权

授权可简单理解为who对what(which)进行How操作:

Who,即主体(Subject),主体需要访问系统中的资源。

What,即资源(Resource),如系统菜单、页面、按钮、类方法、系统商品信息等。资源包括资源类型资源实例,比如商品信息为资源类型,类型为t01的商品为资源实例,编号为001的商品信息也属于资源实例。

How,权限/许可(Permission),规定了主体对资源的操作许可,权限离开资源没有意义,如用户查询权限、用户添加权限、某个类方法的调用权限、编号为001用户的修改权限等,通过权限可知主体对哪些资源都有哪些操作许可。

在这里插入图片描述

1.1 授权方式

  • 基于角色的访问控制

    • RBAC基于角色的访问控制(Role-Based Access Control)是以角色为中心进行访问控制

      if(subject.hasRole("admin")){
         //操作什么资源
      }
      
  • 基于资源的访问控制

    • RBAC基于资源的访问控制(Resource-Based Access Control)是以资源为中心进行访问控制

      if(subject.isPermission("user:update:01")){ //资源实例
        //对01用户进行修改
      }
      if(subject.isPermission("user:update:*")){  //资源类型
        //对01用户进行修改
      }
      

    1.2 权限字符串

权限字符串的规则是:资源标识符:操作:资源实例标识符,意思是对哪个资源的哪个实例具有什么操作,“:”是资源/操作/实例的分割符,权限字符串也可以使用*通配符。

例子:

  • 用户创建权限:user:create,或user:create:*
  • 用户修改实例001的权限:user:update:001
  • 用户实例001的所有权限:user:*:001

1.3 shiro中授权的编程实现

  • 编程式

    Subject subject = SecurityUtils.getSubject();
    if(subject.hasRole(“admin”)) {
    	//有权限
    } else {
    	//无权限
    }
    
  • 注解式

    @RequiresRoles("admin")
    public void hello() {
    	//有权限
    }
    
  • 标签式

    JSP/GSP 标签:在JSP/GSP 页面通过相应的标签完成:
    <shiro:hasRole name="admin">
    	<!— 有权限—>
    </shiro:hasRole>
    注意: Thymeleaf 中使用shiro需要额外集成!
    

2 案例

/**
 * @Description md5 + salt + hash
 * @Author tzb
 * @Date 2021/8/28 10:41
 * @Version 1.0
 **/
public class CustomMd5Realm extends AuthorizingRealm {

    /**
     * 授权
     *
     * @param principals
     * @return
     */
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {

        String primaryPrincipal = (String) principals.getPrimaryPrincipal();
        System.out.println("身份信息:" + primaryPrincipal);

        //根据名字获取角色
        SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();

        //将数据库查询出的角色信息赋值给权限对象
        info.addRole("admin");
        info.addRole("user");


        //将数据库查询权限信息赋值给权限对象
        info.addStringPermission("user:*:*");

        return info;
    }

    /**
     * 认证
     *
     * @param token
     * @return
     * @throws AuthenticationException
     */
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {

        //获取身份信息
        String principal = (String) token.getPrincipal();

        //根据用户名查数据库
        if ("Mike".equals(principal)) {
            SimpleAuthenticationInfo simpleAuthenticationInfo =
                    new SimpleAuthenticationInfo("Mike",
                            "ead587102bc9adbf3ffda3f28d2e5dc8",
                            ByteSource.Util.bytes("qq"), this.getName());
            return simpleAuthenticationInfo;
        }

        return null;
    }
}

public class TestCustomMd5RealmAuthenticator {

    public static void main(String[] args) {
        //1.创建SecurityManager
        DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager();

        CustomMd5Realm realm = new CustomMd5Realm();

        HashedCredentialsMatcher credentialsMatcher = new HashedCredentialsMatcher();
        credentialsMatcher.setHashAlgorithmName("md5");
        credentialsMatcher.setHashIterations(1024);

        //设置realm使用hash凭证匹配器
        realm.setCredentialsMatcher(credentialsMatcher);

        //2.设置realm
        defaultSecurityManager.setRealm(realm);

        //3.安全工具类设置
        SecurityUtils.setSecurityManager(defaultSecurityManager);

        //4.通过安全工具类获取subject
        Subject subject = SecurityUtils.getSubject();

        //创建Token
        UsernamePasswordToken token = new UsernamePasswordToken("Mike","123");

        //执行认证
        try {
            subject.login(token);
            System.out.println("查询授权状态:" + subject.isAuthenticated());
        } catch (AuthenticationException e) {
            e.printStackTrace();
        }

        //认证用户进行授权
        if(subject.isAuthenticated()){
            // 1.基于角色权限控制
            System.out.println(subject.hasRole("admin"));
            // 多角色
            System.out.println(subject.hasAllRoles(Arrays.asList("admin", "user")));

            System.out.println("=====================================================");

            //2.基于权限字符串的访问控制, 资源标识符:操作:资源类型
            System.out.println("权限:"+subject.isPermitted("user:update:01"));
        }

    }
}

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Shiro实战学习笔记(3)- 授权 的相关文章

随机推荐

  • 解决uniapp的checkBox取消选中

  • 递归函数详解

    文章目录 1 什么是递归函数 2 递归求阶乘 3 递归的进入 4 递归的退出 5 递归的条件 1 什么是递归函数 一个函数在它的函数体内调用它自身称为递归调用 这种函数称为递归函数 执行递归函数将反复调用其自身 每调用一次就进入新的一层 当
  • IPv6详解

    定义 128bit冒号分16进制 详解 2001 5 23位 24 32位 33 48位 49 64位 固定开头 regisrty isp prefix site prefix subnet prefix 地址类型 设备没有获取ipv6地址
  • 计算机编码发展历史和编码方式

    编码是信息从一种形式或格式转换为另一种形式的过程 也称为计算机编程语言的代码简称编码 用预先规定的方法将文字 数字或其它对象编成数码 或将信息 数据转换成规定的电脉冲信号 编码在电子计算机 电视 遥控和通讯等方面广泛使用 解码 是编码的逆过
  • 【Seq2Seq】卷积序列到序列学习

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • c#之sealed关键字

    using System using System Collections Generic using System Linq using System Text using System Threading Tasks namespace
  • 仙境传说RO:NPC对话

    仙境传说RO NPC对话 mes next close函数用法详解 大家好 我是艾西 今天跟大家讲解下仙境传说mes next close函数 在游戏中所有的NPC对话都是用mes函数来创建的 我们先打开官方文档的script comman
  • win10系统打开文件安装软件总是弹出安全警告解决办法

    描述 win10系统打开文件安装软件总是弹出安全警告解决办法 步骤 win键 R 输入gpedit msc 点击用户配置 gt 管理模板 gt windows组件 gt 附件管理器文件夹 找到右侧的窗口中找到中等风险文件类型的包含列表设置
  • DemuxException: type = CodecUnsupported, info = Flv: Unsupported codec in video frame: 2

    使用ffmpeg推流到nginx服务器 带http flv module插件 ffmpeg re i rtsp admin qwer1234QWER 10 0 10 3 554 h264 ch1 sub av stream f flv rt
  • 2021-01-05

    c语言 郝斌 p141 malloc函数介绍 include
  • Swagger类的配置

    1 引入相关依赖
  • 华为OD机试 - TLV解析 Ⅱ(Java)

    题目描述 两端通过TLV格式的报文来通信 现在收到对端的一个TLV格式的消息包 要求生成匹配后的 tag length valueOffset 列表 具体要求如下 1 消息包中多组tag length value紧密排列 其中tag len
  • python基础:Python判断文件是否存在的三种方法(os.path.exsist, os.path.isfile, try-catch)

    博客原文 http www spiderpy cn blog detail 28 目录 前言 一 使用os模块 二 使用try catch 前言 通常在读写文件之前 需要判断文件或目录是否存在 不然某些处理方法可能会使程序出错 所以最好在做
  • robot framework实现web和app自动化

    前言 本文 仅适用于完全没接触过rf的小白 也是作为自己学习的一个记录 一 工欲善其事必先利其器 第一步 环境安装 1 需要python环境 去官网下载python解释器 配置环境变量 2 安装robotframework pip inst
  • Python如何实现自动发送直播弹幕,让美女主播一眼看到你

    前言 嘀嘀嘀 你喜欢的女主播开始直播了 咱就是说 时隔两个月 我又回来了 这次不是忘记密码 而是直接忘记这个账号了哈哈 报一丝啊报一丝 不过这次我真的就是会常更新的 因为看到后台还是有小伙伴私信我的 结果才看到信息 每次看直播 不知道大家有
  • C语言--数组&指针笔试题解析(指针:你看我几分像从前)

    尊贵的各位大厂码农你们好 是的 没错 我又来找你们来帮我指正文章了 今天的主题是数组和指针的笔试题专栏 大家给掌掌眼 有问题的话还请帮忙斧正哦 目录 前言 一 数组笔试题 一 一维数组 二 字符数组 2 1 直接赋值型的字符数组 2 2 字
  • 人体姿态2019(四)SemGCN——Semantic Graph Convolutional Networks for 3D Human Pose Regression

    Semantic Graph Convolutional Networks for 3D Human Pose Regression 论文解读 Abstract 1 Introduction 2 Related work 3 Semanti
  • opencv3.4.1mat和Iplimage*互转

    opencv3 4 1mat和Iplimage 互转 Mat转IplImage Mat Img imread 1 jpg IplImage pBinary IplImage Img 浅拷贝 IplImage input cvCloneIma
  • 88 扑克牌大小

    题目描述 扑克牌游戏大家应该都比较熟悉了 一副牌由54张组成 含3 A 2各4张 小王1张 大王1张 牌面从小到大用如下字符和字符串表示 其中 小写joker表示小王 大写JOKER表示大王 3 4 5 6 7 8 9 10 J Q K A
  • Shiro实战学习笔记(3)- 授权

    1 授权 授权可简单理解为who对what which 进行How操作 Who 即主体 Subject 主体需要访问系统中的资源 What 即资源 Resource 如系统菜单 页面 按钮 类方法 系统商品信息等 资源包括资源类型和资源实例