权限管理框架Shiro renren-security权限管理结构

news2025/7/22 7:22:30

权限管理框架Shiro:

一直在做项目,由于是二次开发的项目,今天才发现自己连权限控制都没有搞懂。二次开发的是基于renren开源的一个项目。
链接:https://gitee.com/renrenio/renren-security
这个项目主要使用shiro权限管理框架来进行权限管理

shiro主要概念:

aaa

  • Subject: 正如我们在教程中提到的,该Subject本质上是当前执行用户的安全特定“视图”。虽然“用户”一词通常意味着一个人,但Subject可以是人,但它也可以代表第三方服务、守护进程帐户、cron作业或任何类似的东西——基本上是目前与软件交互的任何东西。Subject实例都绑定(并需要)SecurityManager。当您与Subject交互时,这些交互将转换为与SecurityManager的特定主题交互。

  • SecurityManager: SecurityManager是Shiro架构的核心,它充当一种“雨伞”对象,协调其内部安全组件,这些组件一起形成一个对象图。然而,一旦SecurityManager及其内部对象图为应用程序配置,它通常就会被单独使用,应用程序开发人员几乎所有的时间都花在Subject API上。

    我们稍后将详细讨论SecurityManager,但重要的是要意识到,当您与Subject互动时,实际上是SecurityManager在幕后为任何Subject安全操作做了所有繁重的工作。这反映在上面的基本流程图中。

  • Realms: Realms充当Shiro和应用程序安全数据之间的“桥梁”或“连接器”。当需要实际与用户帐户等安全相关数据进行交互以执行身份验证(登录)和授权(访问控制)时,Shiro会从为应用程序配置的一个或多个Realms查找其中许多内容。

    从这个意义上讲,Realms本质上是一个特定于安全的DAO:它封装了数据源的连接详细信息,并根据需要向Shiro提供相关数据。在配置Shiro时,您必须指定至少一个用于身份验证和/或授权的RealmsSecurityManager可以配置多个Realms,但至少需要一个领域。

shiro

  • Subject : 当前与软件交互的实体(用户、第三方服务、cron作业等)的安全特定“视图”。
  • SecurityManager: 如上所述,SecurityManager是Shiro架构的核心。它主要是一个“雨伞”对象,负责协调其托管组件,以确保它们平稳地一起工作。它还管理Shiro对每个应用程序用户的视图,因此它知道如何为每个用户执行安全操作。
  • Authenticator: 身份验证器是负责执行和响应用户身份验证(登录)尝试的组件。当用户尝试登录时,该逻辑由身份验证器执行。身份验证器知道如何与一个或多个存储相关用户/帐户信息的Realms进行协调。从这些Realms获得的数据用于验证用户的身份,以保证用户真的是他们所说的自己。
    • Authentication Strategy : 如果配置了多个Realms,身份验证策略将协调Realms,以确定身份验证尝试成功或失败的条件(例如,如果一个领域成功,而其他领域失败,则尝试是否成功?所有领域都必须成功吗?只有第一个?)。
  • Authorizer: Authorizer 是负责确定应用程序中用户访问控制的组件。它最终表明用户是否被允许做某事的机制。与身份 Authenticator一样, Authorizer 也知道如何与多个后端数据源协调以访问角色和权限信息。 Authorizer 使用此信息来准确确定是否允许用户执行给定操作。
  • SessionManager : SessionManager 知道如何创建和管理用户会话生命周期,以便在所有环境中为用户提供强大的会话体验。这是安全框架世界中的一项独特功能-Shiro有能力在任何环境中原生管理用户会话,即使没有可用的Web/Servlet或EJB容器。默认情况下,Shiro将使用现有的会话机制(例如Servlet容器),但如果没有,例如在独立应用程序或非Web环境中,它将使用其内置的企业会话管理来提供相同的编程体验。SessionDAO的存在是为了允许使用任何数据源来持久化会话。
    • SessionDAO : SessionDAO代表SessionManager执行会话持久性(CRUD)操作。这允许将任何数据存储插入 SessionManager.基础架构。
  • CacheManager: CacheManager 创建和管理其他Shiro组件使用的Cache实例生命周期。由于Shiro可以访问许多后端数据源进行身份验证、授权和会话管理,因此缓存一直是框架中一流的架构功能,以提高使用这些数据源时的性能。任何现代开源和/或企业缓存产品都可以插入Shiro,以提供快速高效的用户体验。
  • Cryptography: Cryptography(密码学)是企业安全框架的自然补充。Shiro的加密包包含易于使用和理解的冷冻密码、散列(又名摘要)和不同编解码器实现的表示。此软件包中的所有类都经过精心设计,非常易于使用和理解。任何使用过Java原生密码学支持的人都知道,驯服它可能是一种具有挑战性的动物。Shiro的加密API简化了复杂的Java机制,使密码学易于普通凡人使用。
  • Realms: 如上所述,Realms充当Shiro和应用程序安全数据之间的“桥梁”或“连接器”。当需要实际与用户帐户等安全相关数据进行交互以执行身份验证(登录)和授权(访问控制)时,Shiro会从为应用程序配置的一个或多个Realms查找其中许多内容。您可以根据需要配置尽可能多的Realms(通常每个数据源一个),Shiro将在身份验证和授权方面根据需要与他们协调。

renren-security 总体权限的表结构:
database

renren-security 主要的配置文件:

renren

renren-security 登录流程:

  1. 获取用户名和密码:SysUserDTO user = sysUserService.getByUsername(login.getUsername());
  2. 如果用户存在,并且密码正确返回token,否则返回登录失败。
  3. 返回token:sysUserTokenService.createToken(user.getId());
    1. 根据id获取token,查看以前是否生成过token SysUserTokenEntity tokenEntity = baseDao.getByUserId(userId);,生成过了token的用户都会将信息存储到数据库的表sys_user_token

    2. 需要注意的是这个token只是一个随机字符串,真正存储了有效时间的是在这个表中。

    3. token

    4. 如果以前没有生成过token,则会生产新的token,并插入到这个表中,expire_date的时间为12个小时之后。

    5. 如果以前有生成过token,则会把这个数据库中的信息取出来,

renren-security 授权流程:

    @GetMapping("{id}")
    @ApiOperation("信息")
    @RequiresPermissions("sys:dict:info")
    public Result<SysDictDataDTO> get(@PathVariable("id") Long id){
        SysDictDataDTO data = sysDictDataService.get(id);

        return new Result<SysDictDataDTO>().ok(data);
    }

权限:

  1. 在controller层里面加上权限认证:@RequiresPermissions("sys:dict:info")
  2. 如果有请求发送到这个方法上面,则会调用Realm里面的doGetAuthorizationInfo权限验证方法。
  3. 通过传进来的参数获取到用户信息:UserDetail user = (UserDetail)principals.getPrimaryPrincipal();
  4. 通过用户信息查询权限列表:Set<String> permsSet = shiroService.getUserPermissions(user);
    1. 这里需要注意:permissionsList = sysMenuDao.getPermissionsList();sys_menu表里面查询权限。
  5. 将权限列表设置到SimpleAuthorizationInfo里面即可,info.setStringPermissions(permsSet); 如果没有相应的权限就会报错。如果有权限即可执行方法。

角色:

  1. 将上面的第四步改成查询角色即可。info.setRoles(roles);

参考文章链接:

  • https://gitee.com/renrenio/renren-security
  • https://shiro.apache.org
  • https://www.renren.io/guide/security

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

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

相关文章

31、Java高级特性——Math类、Random类、String类、StringBuffer类、StringBuilder类

目录 一、Math类 1、Math类中的方法 1.1 圆周率&#xff1a;PI 1.2 绝对值&#xff1a;abs() 1.3 返回最小近似值:ceil() 1.4 返回最大近似值 1.5 四舍五入&#xff1a;round() 1.6 最大值和最小值&#xff1a;max()/min() 1.7 求指定次幂 &#xff1a;po…

Java面向对象16:接口的定义与实现

普通类&#xff1a;只有具体的实现 抽象类&#xff1a;具体的实现和规范&#xff08;抽象方法&#xff09;都有 接口&#xff1a;只有规范&#xff01;自己无法写方法&#xff0c;专业的约束&#xff0c;约束和实现分离&#xff1a;面向接口编写&#xff08;大佬把接口定义好…

vue3 响应式 API 之 ref

ref 是最常用的一个响应式 API&#xff0c;它可以用来定义所有类型的数据&#xff0c;包括 Node 节点和组件。 没错&#xff0c;在 Vue 2 常用的 this.$refs.xxx 来取代 document.querySelector(‘.xxx’) 获取 Node 节点的方式&#xff0c;也是使用这个 API 来取代。 类型声明…

[附源码]计算机毕业设计JAVA乒乓球俱乐部管理系统

[附源码]计算机毕业设计JAVA乒乓球俱乐部管理系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM my…

我为什么将机器学习主力语言从Python转到Rust

我为什么将机器学习主力语言从Python转到Rust 文章目录写在前面Python的痛点猴子补丁(Monkey Patch)缺乏参数类型校验允许跨作用域访问运行缓慢太多隐含规则Rust之剑猴子补丁参数类型作用域运行速度隐含规则结论写在前面 首先要声明一下&#xff1a;Python依然是我最喜欢的编程…

S5PV210的启动过程

一、内存 SRAM 静态内存 特点就是容量小、价格高&#xff0c;优点是不需要软件初始化直接上电就能用。DRAM 动态内存 特点就是容量大、价格低&#xff0c;缺点就是上电后不能直接使用&#xff0c;需要软件初始化后才可以使用。 单片机中&#xff1a;内存需求量小&#xff0c;而…

SpringBoot SpringBoot 开发实用篇 6 监控 6.7 自定义端点

SpringBoot 【黑马程序员SpringBoot2全套视频教程&#xff0c;springboot零基础到项目实战&#xff08;spring boot2完整版&#xff09;】 SpringBoot 开发实用篇 文章目录SpringBootSpringBoot 开发实用篇6 监控6.7 自定义端点6.7.1 问题引入6.7.2 自定义端点6.7.3 小结6.7.…

20221125使用PR2023自动识别obs-studio录屏生成的MKV视频的字幕

20221125使用PR2023自动识别obs-studio录屏生成的MKV视频的字幕 2022/11/25 19:07 01 obs.png obs studio &#xff08;64bit&#xff09; 02 obs 设置.png 03 obs 输出.png 04 obs默认为MKV.png 05 obs改mkv为MP4.png 警告&#xff1a;如果文件无法完成&#xff08;例如&…

供应Alkyne-PEG-Biotin,Alk-PEG-Biotin,炔烃-聚乙二醇-生物素

炔烃-聚乙二醇-生物素是一种化学PEG试剂其英文名为Alkyne-PEG-Biotin&#xff08;Alk-PEG-Biotin&#xff09;&#xff0c;它所属分类为Alkyne PEG Biotin PEG。 peg试剂的分子量均可定制&#xff0c;有&#xff1a;生物素-聚乙二醇5-炔烃、生物素-PEG 20-炔烃 、Biotin-PEG 2…

【kafka】九、kafka消费者分区分配策略

消费者分区分配策略 分区分配策略 一个consumer group中有个多个topic&#xff0c;一个topic有多个partition&#xff0c;所以必然会涉及到partition的分配问题&#xff0c;即确定哪个partition由哪个消费者进行消费。 kafka有两种分配策略&#xff0c;RoundRobin和Range Ro…

JAVA实训第三天

目录 方法引用 示例 接口 类 测试类 Stream ​编辑 Stream 的操作三个步骤 创建 Stream 的 4 种方法 常见Stream接口的继承关系 Stream的中间操作 中间操作常用方法 Stream的终止操作 Stream的终止操作-collect() 示例代码演示 作业 方法引用 在Lamda新特性的支持下&…

电商商家速看 这些TikTok选品玩法你知道多少?

调查报告显示&#xff0c;有3成的商家在TiTok平台上运营电商&#xff0c;谋求TikTok变现增长。在海内外文化习惯、市场环境存在较大差异的情况下&#xff0c;如何 TikTok选品是他们的主要困难。李先生是具有丰富经验的TikTok电商商家&#xff0c;他表示想要实现TikTok变现增长&…

【RuoYi-Vue-Plus】学习笔记 44 - XSS 过滤器以及 @Xss 注解简单分析

文章目录前言参考目录关于 XSS 攻击框架集成配置说明测试方法一&#xff1a;通过过滤器测试方法二&#xff1a;通过 Xss 注解功能调用流程分析XSS 过滤器启动初始化Form 表单请求过滤JSON 对象请求过滤Xss 注解校验前言 之前在对接口进行传参时发现富文本包含的标签全部被过滤…

成功解决 java.lang.NumberFormatException

急于查看问题原因的小伙伴&#xff0c;直接跳到 问题原因 标题。 问题背景&#xff1a; 今天在写条件查询时遇到这么一个错&#xff1a; ### Error querying databasecause: java.lang.NumberFormatException: For input string: "M ### Cause: iava.lang.NumberFormatE…

Ros驱动Ur5e过程 | 手把手教程 | Ros驱动真实机器人Ur5e | Ros与Ur5e建立通讯 | Ubuntu20.04驱动Ur5e机器人

目录 UR5e连接过程 安装ROS 安装moveit 电脑端UR机器人驱动安装 UR实体机器人-软件安装与通信建立 urcap软件安装 电脑端ip问题 需要指定临时ip的情况 不需指定临时ip UR机器人IP 机器人的启动 驱动UR机器人 电脑-ip : 192.168.56.1 ur5e-ip &#xff1a;192.168.5…

【STM32CubeMX】NRF24L01模块实现“1对1“及“1对多“无线通信

大家好&#xff0c;我是小政。本篇文章我将针对NRF24L01模块实现"1对1"及"1对多"无线通信的STM32CubeMX配置过程进行详细的讲解&#xff0c;让准备学习HAL库的小伙伴能够更好的理解STM32CubeMX如何配置。 NRF24L01模块实现"1对1"及"1对多&q…

【OpenCV-Python】教程:3-9 轮廓(5)轮廓层级

OpenCV Python 轮廓层次 【目标】 学习轮廓的层次关系 在前几个课程里面&#xff0c;学习了 cv2.findContours() 函数, 传递了参数 Contour Retrieval Mode . 通常是 cv.RETR_LIST or cv.RETR_TREE 工作的很好&#xff0c;但是他们是什么意思呢&#xff1f; hierarchy 到底是…

基于DMF推荐算法的推荐系统 代码+数据 (可作为毕设)

案例知识点 推荐系统任务描述:通过用户的历史行为(比如浏览记录、购买记录等等)准确的预测出用户未来的行为;好的推荐系统不仅如此,而且能够拓展用户的视野,帮助他们发现可能感兴趣的却不容易发现的item;同时将埋没在长尾中的好商品推荐给可能感兴趣的用户。DMF推荐方法…

C语言既然可以自动为变量分配内存,为什么还要用动态分配内存呢?

一、前言 不知道大家在学习C语言动态分配内存的时候有没有过这样的疑问&#xff0c;既然系统可以自动帮我们分配内存&#xff0c;为什么还需要我们程序员自己去分配内存呢&#xff1f; 如果想要弄清楚这些问题&#xff0c;我们首先就要了解静态内存和动态内存有什么区别&…

python学习笔记

第一个python程序 pycharm使用 pycharm下载链接&#xff1a; https://www.jetbrains.com/zh-cn/pycharm/download/#sectionwindows 1. 新建项目 右键test—> 点击new 输入文件名 运行 结果 2. 调节字体大小快捷键设置 右键添加鼠标快捷键 按住ctrl鼠标向上滑动 放…