Shiro授权详解

news2024/10/24 4:08:39

在进行Shiro授权之前,了解相关术语对于理解整个过程至关重要。Shiro的授权机制以角色为中心,辅以权限,来控制主体对资源的访问。以下是常用术语的简要介绍:

  • 授权 (Authorization)
    授权是指确定主体是否有权访问某一资源或执行某一操作。通过角色和权限机制,Shiro为系统提供了细粒度的访问控制能力

  • 主体 (Subject)
    主体是指当前的用户、设备或其他能与应用进行交互的实体。每个主体在登录后,会被分配一定的权限和角色来确定其行为

  • 资源 (Resource)
    资源可以是系统中的任意数据或服务,例如文件、API接口等,主体通过权限来访问这些资源

  • 权限 (Permission)
    权限是允许主体执行某个具体操作的规则。Shiro的权限是基于字符串的,可以通过自定义规则实现不同的访问控制策略

  • 角色 (Role)
    角色是权限的集合,主体通过被分配某些角色来获得一系列权限。例如,一个"管理员"角色可能包含创建、更新、删除等权限

  • 隐式角色 (Implicit Role)
    隐式角色是指由系统规则自动分配的角色,无需明确配置。通常基于上下文、属性等信息动态确定

  • 显式角色 (Explicit Role)
    显式角色是通过明确配置的角色,例如在数据库中定义或直接在代码中指定的角色

1. 授权

授权是Shiro中重要的核心功能,通过角色和权限实现系统的安全控制

(1) 授权流程

Shiro的授权过程分为以下几步:

  1. 主体登录
    主体通过身份验证(认证)后,进入授权流程。Shiro通过Subject对象获取当前用户信息

  2. 权限检查
    当主体尝试访问某一资源时,Shiro首先通过SecurityManager查询该主体的权限信息。系统会根据配置的Realm来判断主体是否有权限

  3. 角色检查
    若主体的权限不足,Shiro还会查询主体所属的角色,检查该角色是否具备访问资源的权限

  4. 结果返回
    根据查询结果,Shiro决定是否允许主体访问对应资源。如果授权失败,Shiro会抛出UnauthorizedException异常

(2) 授权方式

Shiro支持多种授权方式,满足不同系统需求

  1. 基于角色的授权
    通过角色为主体赋予一组权限,这种方式适合结构清晰、权限划分明确的场景

    subject.hasRole("admin") //判断主体是否拥有“admin”角色
  1. 基于权限的授权
    直接为主体赋予特定的权限,通常使用字符串标识权限,具有高度灵活性

    subject.isPermitted("file:read")//判断主体是否具备“文件读取”的权限
  2. 基于注解的授权
    Shiro还提供了注解方式,通过注解可以直接在控制器、服务方法中指定授权规则

    @RequiresRoles("admin") 或 @RequiresPermissions("user:update")
2. SpringBoot+Shiro授权

将Shiro与SpringBoot集成是目前比较主流的实践,通过简单的配置即可为SpringBoot项目增加灵活的授权控制

(1) 静态授权

静态授权是指在代码或配置文件中提前定义好角色和权限的关系,不依赖运行时动态数据。这种方式适合权限结构简单的场景

  1. 配置静态授权规则
    在Shiro的配置文件中为不同角色配置权限:

    shiro:
      roles:
        admin: "file:create,file:read,file:update"
        user: "file:read"
    
  2. 代码中基于角色或权限的判断
    在代码中可以使用以下方式进行静态授权:

     System.out.println("调用MyShiroRealm的doGetAuthorizationInfo获取权限信息");
            //获得权限信息
            User user = (User) principalCollection.getPrimaryPrincipal();
            SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
            info.addRole(user.getRole().getRoleName());
            info.addStringPermission("用户列表");
            //管理增删改
            if ("管理员".equals(user.getRole().getRoleName())) {
                info.addStringPermission("用户添加");
                info.addStringPermission("用户编辑");
                info.addStringPermission("用户删除");
            }
(2) 动态授权

动态授权通过数据库或外部服务来实现对权限的实时控制。此方式更加灵活,适合权限体系复杂、需要频繁调整权限的场景

  1. 动态角色与权限的加载
    通过自定义Realm从数据库中加载角色和权限:

    System.out.println("调用MyShiroRealm的doGetAuthenticationInfo获取身份信息");
    //获得身份信息
    UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken;
    String usrName = token.getUsername();
    User user = userService.getUserByUsrName(usrName);
    if (user == null) {
          throw new AuthenticationException();//账号错误
    }
    if (user.getUsrFlag() == null || user.getUsrFlag().intValue() == 0) {
          throw new LockedAccountException();//账号被禁用
    }
    SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(
                    user,
                    user.getUsrPassword(),
                    getName());

  2. 结合动态数据判断
    使用动态方式可以根据业务需求实时调整权限,例如根据用户角色动态生成权限菜单

    Subject currentUser = SecurityUtils.getSubject();
    
    // 动态判断用户是否有管理员角色
    if (currentUser.hasRole("admin")) {
         return "你好admin";
    } else {
         return "角色不存在!";
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2222076.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

huggingface的数据集下载(linux下clone)

1. 安装lfs sudo apt-get install git-lfs 或者 apt-get install git-lfs 2. git lfs install git lfs install 3. git clone dataset包 第2,3步骤的截图如下:

CentOS7 上安装GitLab的经历

一、安装必要的基础环境 1.安装依赖包 [rootgitlab-server ~]#yum install curl policycoreutils openssh-server openssh-clients postfix wget git patch -y [rootgitlab-server ~]# systemctl start postfix 2.配置yum源(由于网络问题,国内用户请使用清华大学…

架构设计笔记-21-案例分析

1.遗留系统策略 / 数据迁移 / REST和RPC风格 2.分布式系统 / 分布式对象调用 3.开放式架构 / GOA 4.ESB 5.FMEA故障分析 6. 加密 / 公钥体系机制 / 加解密API和透明加密 7.嵌入式系统故障 / 故障滤波算法 / 容错算法 8.开源框架struts / spring / Hibenate 9.企业应用集成 10.T…

Python 应用可观测重磅上线:解决 LLM 应用落地的“最后一公里”问题

作者:彦鸿 背景 随着 LLM(大语言模型)技术的不断成熟和应用场景的不断拓展,越来越多的企业开始将 LLM 技术纳入自己的产品和服务中。LLM 在自然语言处理方面表现出令人印象深刻的能力。然而,其内部机制仍然不明确&am…

2023 WMCTF pwn【blindless jit】

文章目录 blindlessIDA结构体命名逆向漏洞方法1方法2 exp jitstrtol(v9, &endptr, 16)__errno_location和__throw_out_of_range详细解释: __errno_location相关具体操作详细分析为什么要执行上述代码?示例代码段的解释 _acrt_iob_funcSetProcessMiti…

Vue.js 学习总结(9)—— Vue 3 组件封装技巧

1、需求说明 需求背景:日常开发中,我们经常会使用一些UI组件库诸如and design vue、element plus等辅助开发,提升效率。有时我们需要进行个性化封装,以满足在项目中大量使用的需求。错误示范:基于a-modal封装一个自定…

MinIO安装教程

MinIO简介 Minio是一个开源的、云原生的分布式对象存储系统,是一个基于Apache License v2.0开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据。 它一大特点就是轻量,虽然轻量,却拥有着不…

适合忙碌职场人的进度计划工具

明确的进度计划是一种约束机制,职场人往往面临多项任务,通过进度计划管理,可以将工作按照优先级和时间要求进行分解,而进度计划管理可以很好地帮助职场人发现时间浪费的环节。此外,对于忙碌的职场人来说,不…

基于K8S的StatefulSet部署mysql主从

StatefulSet特性 StatefulSet的网络状态 拓扑状态:应用的多个实例必须按照某种顺序启动,并且必须成组存在,例如一个应用中必须存在一个A Pod和两个B Pod,且A Pod必须先于B Pod启动的场景 存储状态:应用存在多个实例&…

《使用Gin框架构建分布式应用》阅读笔记:p88-p100

《用Gin框架构建分布式应用》学习第6天,p88-p100总结,总计13页。 一、技术总结 1.MongoDB CRUD操作 (1)InsertOne(), InsertMany() (2)Find() (3)UpdateOne, UpdateMany() (4)DeleteOne(), DeleteMany() 2.MongoDB primitive p96,rec…

Docker 基础入门

Docker 基础入门 前言 在云计算和微服务架构日益盛行的今天,软件开发与部署的效率和灵活性成为了企业竞争力的关键因素之一。Docker,作为一种开源的容器化平台,凭借其轻量级、可移植性和易于管理的特性,迅速成为现代软件开发和运…

pdf编辑软件有哪些?方便好用的pdf编辑软件分享

PDF文件因其跨平台、格式固定的特性,成为了工作、学习和生活中不可或缺的一部分。然而,随着需求的不断增加,仅仅阅读PDF文件已难以满足我们的需求,编辑、转换PDF文件成为了新的焦点,下面给大家分享几款方便好用的PDF编…

vue3处理货名的拼接

摘要: 货品的拼接规则是:【品牌】货名称/假如货品名称为空时,直接选择品牌为【品牌】赋值给货品,再选择品牌,会替换【品牌】;假如货名称为【品牌】名称,再选择品牌只会替换【品牌】,…

Windows系统PyCharm右键运行.sh文件

在参考了Windows系统下pycharm运行.sh文件,执行shell命令_shell在pycharm-CSDN博客 和深度学习:PyCharm中运行Bash脚本_pycharm bash-CSDN博客 配置了右键执行.sh文件之后,发现在Windows的PyCharm中直接右键运行sh文件,存在如下…

【算法】深入理解布隆过滤器

1. 什么是布隆过滤器? 布隆过滤器(Bloom Filter)是一种空间效率极高的概率型数据结构,用于检测某个元素是否在一个集合中。与常见的数据结构如哈希表不同,布隆过滤器无法删除元素,并且会存在一定的误判率&…

【重学 MySQL】六十七、解锁检查约束,守护数据完整性

【重学 MySQL】六十七、解锁检查约束,守护数据完整性 检查约束的基本概念检查约束的语法检查约束的使用场景注意事项示例 在MySQL中,检查约束(CHECK)是一种用于确保表中数据满足特定条件的约束。 检查约束的基本概念 检查约束用…

【Next.js 项目实战系列】05-删除 Issue

原文链接 CSDN 的排版/样式可能有问题,去我的博客查看原文系列吧,觉得有用的话,给我的库点个star,关注一下吧 上一篇【Next.js 项目实战系列】04-修改 Issue 删除 Issue 添加删除 Button​ 本节代码链接 这里我们主要关注布局…

IPC 管道 Linux环境

管道通信的特点: 1. 单工通信---- 任何一个时刻只能发送方 向 接收方发送数据 2. 流式传输: 1> 先发送的数据先被接收,不能跳跃式接收 ----- 顺序发送顺序接收 2> 未被接收的数据仍然滞留在管道中,下一次可以继续接收后…

与ai一起作诗(《校园清廉韵》)

与ai对话犹如拷问自己的灵魂,与其说ai助力还不如说在和自己对话。 (笔记模板由python脚本于2024年10月19日 19:18:33创建,本篇笔记适合喜欢python和诗歌的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网:https://www.python.org/ Free&…

免费开源Odoo软件如何实现电商仓库高效发货

世界排名第一的免费开源ERP软件Odoo,拥有非常强大的仓库管理WMS功能。本文以电商仓库发货管理为例,介绍电商订单的仓库发货作业的各种方法。电商订单仓库发货流程,通常分为三个步骤,即拣货、打包、发货。根据仓库日处理订单数量的…