Shiro授权(Authorization)

Shiro 授权是指 Shiro 框架(Apache Shiro)中用于控制用户对系统资源(如网页、方法、文件等)访问权限的功能。它决定了已认证(通过身份验证)的用户是否被允许执行特定的操作或者访问特定的资源。简单来说,就是在用户身份被确认之后,进一步确定该用户能做什么。

核心概念:

  • 权限(Permission)
    • 权限是 Shiro 授权的核心元素。它代表了对系统资源的访问许可。例如,在一个文件管理系统中,“读取文件”“写入文件”“删除文件” 等都是不同的权限。权限可以用字符串来表示,如 “user:read” 表示用户模块的读取权限,这种字符串格式方便进行权限的定义、管理和验证。
  • 角色(Role)
    • 角色是一组权限的集合。比如,在一个公司管理系统中,“管理员” 角色可能包含 “员工信息管理”“部门信息管理”“薪资信息查看” 等一系列权限;而 “普通员工” 角色可能只有 “个人信息查看”“考勤打卡” 等权限。角色可以被看作是权限的一个分组,便于对用户进行权限分配。

 Shiro 授权的实现过程:

  • 首先,需要在 Shiro 配置中定义角色和权限。这可以通过编程方式(如在 Java 代码中使用 Shiro 的 API)或者通过配置文件(如 INI 文件、XML 文件等,具体取决于项目的设置)来完成。
  • 当用户请求访问一个资源时,Shiro 会拦截这个请求。然后,它会根据用户的身份(通常是通过之前的身份验证过程获取的用户信息)来检查该用户是否具有访问这个资源所需的角色或者权限。
  • 如果用户具有相应的授权,Shiro 会允许请求通过,资源将被正常访问;如果用户没有授权,Shiro 会阻止请求,并返回一个未授权的提示(如在 Web 应用中返回 403 Forbidden 错误页面)

1,配置shiro.ini

#对用户信息进行配置
[users]
#用户账号密码
#配置规则:用户账号=密码,角色1,角色2
admin=123456,管理员
czkt=111111,客户经理
#对权限信息进行配置,基于角色配置
[roles]
#角色和权限
#配置规则:角色名称=权限1,权限2,权限字符串可使用通配符配置
管理员=user:*,role:*
#客户经理只能对用户进行列表和详细的查看操作
客户经理=user:list,user:view

2,授权测试

package com.bdqn.shiro; import org.apache.shiro.SecurityUtils; import org.apache.shiro.authc.AuthenticationException; import org.apache.shiro.authc.UsernamePasswordToken; import org.apache.shiro.mgt.DefaultSecurityManager; import org.apache.shiro.realm.text.IniRealm; import org.apache.shiro.subject.Subject; import org.junit.Test; public class ShiroTest { @Test public void testShiro(){ //1创建Realm(安全数据源) //通过shiro.ini配置文件创建Realm IniRealm realm=new IniRealm("classpath:shiro.ini"); //2创建SecurityManager DefaultSecurityManager securityManager=new DefaultSecurityManager(); //注入创建的Realm(安全数据源) securityManager.setRealm(realm); SecurityUtils.setSecurityManager(securityManager); //3,操作Subject,进行认证 Subject subject=SecurityUtils.getSubject(); //封装一个令牌 UsernamePasswordToken token=new UsernamePasswordToken("admin","123456"); try { subject.login(token); } catch (AuthenticationException e) { System.out.println("认证异常"); e.printStackTrace(); } System.out.println("是否认证通过:"+subject.isAuthenticated()); //认证通过后,进行权限验证 System.out.println("是否为管理员角色"+subject.hasRole("管理员"));//判断是否为某个角色 System.out.println("是否能操作用户查看功能"+subject.isPermitted("user:view"));//判断是否拥有某个权限 //也可以使用check方法判断是否拥有某权限,但是失败的情况下会抛出UnauthorizedException异常 subject.checkPermission("user:view"); } }

 SpringBoot+Shiro授权:

    • 引入依赖
      • 在 SpringBoot 项目中使用 Shiro,首先需要在项目的pom.xml文件中添加 Shiro 的依赖。通常会添加shiro - spring - boot - starter依赖,这个依赖会自动帮我们配置 Shiro 的基本环境。例如:
     <dependency><groupId>org.apache.shiro</groupId><artifactId>shiro - spring - boot - starter</artifactId><version>1.7.1</version> </dependency>
  • 配置 Shiro
    • 可以通过创建一个ShiroConfig类来配置 Shiro。在这个类中,可以定义 Shiro 的安全管理器(SecurityManager)、过滤器链(FilterChain)等重要组件。例如,定义一个简单的安全管理器:
     @Configurationpublic class ShiroConfig {@Beanpublic SecurityManager securityManager() {DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();// 可以在这里设置Realm等其他组件return securityManager;}}
  1. 授权实现步骤
    • 定义 Realm(领域对象)
      • Realm 是 Shiro 中用于进行认证和授权的数据源。在 SpringBoot + Shiro 中,需要创建一个自定义的 Realm 类,继承自AuthorizingRealm。这个类主要实现两个方法:doGetAuthenticationInfo用于认证,doGetAuthorizationInfo用于授权。例如:
     public class MyRealm extends AuthorizingRealm {@Autowiredprivate UserService userService;@Overrideprotected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {String username = (String) principals.getPrimaryPrincipal();User user = userService.findByUsername(username);SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();// 添加用户角色authorizationInfo.addRole(user.getRole());// 添加用户权限authorizationInfo.addStringPermission(user.getPermission());return authorizationInfo;}@Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {// 认证逻辑,这里省略详细代码return null;}}
  • 配置 Realm 到 SecurityManager
    • ShiroConfig类中,将自定义的 Realm 配置到安全管理器中。例如:
     @Configurationpublic class ShiroConfig {@Beanpublic SecurityManager securityManager() {DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();securityManager.setRealm(myRealm());return securityManager;}@Beanpublic MyRealm myRealm() {return new MyRealm();}}
  • 在 Controller 或 Service 中进行授权检查
    • 在 SpringBoot 的 Controller 或者 Service 层中,可以使用 Shiro 的 API 来进行授权检查。例如,在 Controller 方法中检查用户是否具有某个角色或者权限:
     @RestControllerpublic class MyController {@GetMapping("/admin")@RequiresRoles("admin")public String adminPage() {return "This is the admin page.";}@GetMapping("/user/read")@RequiresPermissions("user:read")public String userReadPage() {return "This is the user read page.";}}
  1. 授权策略调整
    • 基于注解的授权策略
      • 除了上面使用的@RequiresRoles@RequiresPermissions注解外,还可以通过配置 Shiro 来调整这些注解的行为。例如,可以在ShiroConfig类中配置全局的授权异常处理,当用户没有授权访问某个资源时,返回自定义的错误信息:
     @Configurationpublic class ShiroConfig {@Beanpublic AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) {AuthorizationAttributeSourceAdvisor advisor = new AuthorizationAttributeSourceAdvisor();advisor.setSecurityManager(securityManager);return advisor;}}
  • 自定义授权过滤器
    • 可以创建自定义的授权过滤器来满足特定的业务需求。例如,创建一个过滤器来检查用户是否同时具有多个权限才能访问某个资源。首先创建一个自定义过滤器类,继承自PathMatchingFilter,然后在ShiroConfig类中将其配置到过滤器链中。
  1. 与数据库集成进行授权管理
    • 通常情况下,用户的角色和权限信息是存储在数据库中的。在 SpringBoot + Shiro 中,可以通过在自定义的 Realm 类中注入数据访问层(如 JPA Repository 或者 MyBatis Mapper)来从数据库中获取用户的角色和权限信息。例如,在MyRealm类中注入UserRepository来获取用户信息、角色信息和权限信息,以实现动态的授权管理,根据数据库中的数据实时更新用户的授权状态

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

玫瑰花HTML源码

HTML源码 <pre id"tiresult" style"font-size: 9px; background-color: #000000; font-weight: bold; padding: 4px 5px; --fs: 9px;"><b style"color:#000000">0010000100000111101110110111100010000100000100001010111111100110…

unity学习-全局光照(GI)

在全局光照&#xff08;Lighting&#xff09;界面有两个选项 Realtime Light&#xff08;实时光照&#xff09;&#xff1a;在项目中会提前计算好光照以及阴影的程序&#xff0c;当你需要调用实时全局光照的时候会将程序调用出来使用 Mixed Light&#xff08;烘焙光照&#x…

Nova-Admin:基于Vue3、Vite、TypeScript和NaiveUI的开源简洁灵活管理模板

嗨&#xff0c;大家好&#xff0c;我是小华同学&#xff0c;关注我们获得“最新、最全、最优质”开源项目和工作学习方法 Nova Admin是一个基于Vue3、Vite、TypeScript和NaiveUI的简洁灵活的管理模板。这个项目旨在为开发者提供一个现代化、易于定制的后台管理界面解决方案。无…

什么是3D模型?如何进行3D建模?应用领域有哪些?

3D模型是在计算机图形学中&#xff0c;为某个表面或物体在专用软件中创建的数字形象&#xff0c;它代表了一个物理实体在三维空间中的形态。以下是对3D模型的详细解释及实现方式的介绍&#xff1a; 一、3D模型的定义 概念&#xff1a;3D模型&#xff0c;即三维模型&#xff0…

springboot+vue的宠物医院管理系统(源码+lunwen)

基于vuespringboot的宠物医院管理系统&#xff0c;分为前台页面和后台管理端。 前台页面&#xff1a; 用户注册与登录&#xff1a;用户可以创建账户并登录系统&#xff0c;以便预约服务、查看个人信息等。宠物信息管理&#xff1a;用户可以添加、编辑和删除自己的宠物信息&am…

数字后端实现静态时序分析STA Timing Signoff之min period violation

今天给大家分享一个在高性能数字IC后端实现timing signoff阶段经常遇到的min period violation。大部分时候出现memory min period问题基本上都是需要返工重新生成memory的。这是非常致命的错误&#xff0c;希望大家在做静态时序分析时一定要查看min period violation。 什么是…

RabbitMQ 发布确认模式

RabbitMQ 发布确认模式 一、原理 RabbitMQ 的发布确认模式&#xff08;Publisher Confirms&#xff09;是一种机制&#xff0c;用于确保消息在被 RabbitMQ 服务器成功接收后&#xff0c;发布者能够获得确认。这一机制在高可用性和可靠性场景下尤为重要&#xff0c;能够有效防止…

数据结构——顺序表的基本操作

前言 介绍 &#x1f343;数据结构专区&#xff1a;数据结构 参考 该部分知识参考于《数据结构&#xff08;C语言版 第2版&#xff09;》24~28页 补充 此处的顺序表创建是课本中采用了定义方法为SqList Q来创建&#xff0c;并没有使用顺序表指针的方法&#xff0c;具体两个…

TCL中环开工率下滑,员工集体要求解约赔偿

“ 尽管中环的市占率有所提高&#xff0c;但是高开工率也带来了巨量硅片库存&#xff0c;严重拖累了公司业绩。 ” 转载&#xff1a;科技新知 原创 作者丨依蔓 编辑丨蕨影 因大幅下调开工率&#xff0c;光伏硅片龙头TCL中环疑似遭遇员工“离职潮”&#xff1f; 近日&…

[云] 创建 Docker 镜像,将其推送到 Amazon Elastic Container Registry (ECR),并对已部署的应用程序进行负载测试

在此作业中&#xff0c;您将学习如何使用 AWS Lambda 和 API Gateway 将机器学习模型部署为无服务器应用程序。您将创建 Docker 镜像&#xff0c;将其推送到 Amazon Elastic Container Registry (ECR)&#xff0c;并对已部署的应用程序进行负载测试。此外&#xff0c;您还将分析…

【KEIL那些事 4】CMSIS缺失!!!!导致不能编译!!!!软件自带芯片下载缓慢!!!!!!快速下载芯片包!!!!!

安装了keli发现emmm&#xff0c;CMSIS缺失&#xff01;&#xff01;&#xff01;&#xff01;不能编译&#xff0c;&#xff0c;&#xff0c;自带下载芯片缓慢&#xff0c;&#xff0c;&#xff0c;官网下载emmm&#xff0c;竟然不带动的&#xff01;&#xff01;&#xff01;&…

数据库集群

主从复制 作用&#xff1a; 1.做数据的热备&#xff0c;作为后备数据库&#xff0c;主数据库服务器故障后&#xff0c;可切换到从数据库继续工作&#xff0c;避免数据丢失。 2.架构的扩展。业务量越来越大&#xff0c;I/O访问频率过高&#xff0c;单机无法满足&#xff0c;此…

基于node.js宜家宜业物业管理系统【附源码】

基于node.js宜家宜业物业管理系统 效果如下&#xff1a; 系统首页界面 业主登录界面 停车位页面 小区公告页面 管理员登录界面 管理员功能界面 物业管理员管理界面 缴费信息管理界面 物业管理员功能界面 研究背景 近年来互联网技术飞速发展&#xff0c;给人们的生活带来了极…

《云计算网络技术与应用》实训6-1:配置KVM虚拟机使用NAT网络

任务1、计算节点基础环境准备 1. 使用VMware安装CentOS 7虚拟机&#xff0c;安装时记得开启CPU虚拟化&#xff0c;命名为“KVMC6”。 2. &#xff08;网卡配置和之前的一样&#xff0c;都用100网段&#xff09;网关设置为192.168.100.1&#xff0c;地址段为192.168.100.10-25…

excel将文本型数字转变为数值型数字

问题导入&#xff1a;复制数字到excel表格中&#xff0c;但是表格中数字显示为文本&#xff0c;且无法通过常规方法转变为可进行四则运算的数字。例如&#xff1a;在i3单元格中输入常规的转换方法仍然报错。在j3单元格中输入ISTEXT(H3)显示h3单元格确实为文本。 解决办法&#…

Chrome DevTools 三: Performance 性能面板扩展—— 性能优化

Performance 性能 &#xff08;一&#xff09;性能指标 首次内容绘制 (First Contentful Paint&#xff0c;FCP)&#xff1a; 任意内容在页面上完成渲染的时间 最大内容绘制 (Largest Contentful Paint&#xff0c;LCP)&#xff1a; 最大内容在页面上完成渲染的时间 第一字节…

【经管】比特币与以太坊历史价格数据集(2014.1-2024.5)

一、数据介绍 数据名称&#xff1a;比特币与以太坊历史价格数据集 频率&#xff1a;逐日 时间范围&#xff1a; BTC&#xff1a;2014/9/18-2024/5/1 ETH&#xff1a;2017/11/10-2024/5/1 数据格式&#xff1a;面板数据 二、指标说明 共计7个指标&#xff1a;Date、Open…

天润融通大模型文本机器人,让客服迈入“无人化”的第一步

明明很着急&#xff0c;但客服机器人总是答非所问&#xff1f; 相信很多人都经历过这样的尴尬时刻&#xff0c;问题的关键&#xff0c;是传统文本机器人还在通过关键词和基础语义分析回答问题。 △传统机器人处理问题流程示意 要知道在客户咨询与服务过程中&#xff0c;用户的…

架构师备考-背诵精华(系统架构评估)

系统架构评估是在对架构分析、评估的基础上&#xff0c;对架构策略的选取进行决策。它利用数学或逻辑分析技术&#xff0c;针对系统的一致性、正确性、质量属性、规划结果等不同方面&#xff0c;提供描述性、预测性和指令性的分析结果。 重要概念 敏感点&#xff1a;敏感点是…

Linux系统基础-进程间通信(4)_模拟实现进程池

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 Linux系统基础-进程间通信(4)_模拟实现进程池 收录于专栏[Linux学习] 本专栏旨在分享学习Linux的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f4…