Shiro相关知识

news/2024/11/23 0:18:19/

1、Shiro功能概述

Apache Shiro是一个功能强大且易于使用的 Java 安全框架,可执行身份验证、授权、加密和会话管理。

主要功能:

  • Authentication:身份认证。登录时验证身份信息。
  • Authorization:授权操作。访问控制的过程,即确定“谁”有权访问“什么”。
  • SessionManager:会话管理。这的Session并不是我们的HttpSession。
  • Cryptography:加密。使用加密算法确保数据安全。

扩展功能:

  • Web Suppot:对于Web的支持,可以更简易的集成 Web 项目。
  • Caching:缓存。登录授权后,把用户信息缓存起来,这样就不用每次都去数据库中查询,提高效率。
  • Concurrency:并发性。通过其并发功能支持多线程应用程序。
  • Testing:支持测试。
  • Run As:允许用户采用其他用户的标识(如果允许)的功能。 
  • Remember Me:记住用户跨会话的身份,只需要在强制登录时登录。

2、Shiro的三大核心

掌握核心点对使用Shiro有很大的帮助:

整个流程就是:应用代码通过 Subject 来进行认证和授权,而 Subject 又委托给 SecurityManager;我们需要给 Shiro 的 SecurityManager 注入 Realm,从而让 SecurityManager 能得到合法的用户及其权限进行判断。

Subject:主体,代表了当前 “用户”,这个“用户”是一个抽象的概念,它也可以是第三方程序,大体理解为任何与系统交互的“东西”都可以称为Subject。所有 Subject 都绑定到 SecurityManager,与 Subject 的所有交互都会委托给 SecurityManager;可以把 Subject 认为是一个门面;SecurityManager 才是实际的执行者;

SecurityManager:安全管理器;它管理着所有 Subject;可以看出它是 Shiro 的核心,它负责与后边介绍的其他组件进行交互,如果学习过 SpringMVC,你可以把它看成 DispatcherServlet 前端控制器;

Realm:领域,Shiro 从Realm 获取安全数据(如用户、角色、权限),就是说 SecurityManager 要验证用户身份,那么它需要从 Realm 获取相应的用户进行比较以确定用户身份是否合法;也需要从 Realm 得到用户相应的角色 / 权限进行验证用户是否能进行操作。

3、RBAC的概念

RBAC(Role-Based Access Control)就是基于角色的访问控制。三要素就是用户、角色、权限,概括来说就是用户拥有什么角色,这些角色被分配了哪些操作权限。后续案例中其实是最简单的一种数据模型,实际项目中还会存在部门、用户组啥的。

4、身份认证流程

大体看一下流程有助于我们后续搭建项目。

  1. 应用程序代码调用 Subject.login(token) 方法,这里要传入AuthenticationToken 。
  2. 将 Subject 实例委托给应用程序的 SecurityManager,实际身份验证工作开始
  3. 委托给封装的验证器进行身份验证。authenticator.authenticate(token)
  4. 通过回调AuthenticationStrategy来执行多域身份验证尝试,需要注意的是只要一个Realm时是不需要这个的
  5. 从图中可以看到我们可以Custom Realm(自定义Realm),将传入的AuthenticationToken和Realm匹配,成功匹配后会创建一个subject实例。

5、授权流程

  1. 当调用subject.hashRole*/checkRole*/isPermitted*/checkPermission*方法,传入相应参数。
  2. 仍然委托给Security Manager
  3. SecurityManager通过Authorizer的hashRole*/checkRole*/isPermitted*/checkPermission*方法验证是否拥有角色或资源
  4. Authorizer类hasRole方法内通过AuthorizingRealm的getAuthorizationInfo获取角色信息,AuthorizingRealm最后通过调用子类的doGetAuthrizationInfo获取用户角色集合,在通过集合的contains方法判断角色。】

大体意思也就是最后它会去我们自定义Realm中查找subject拥有的角色或资源是否包括传入的参数。


http://www.ppmy.cn/news/57133.html

相关文章

AWSFireLens轻松实现容器日志处理

applog应用程序和fluent-bit共享磁盘,日志内容是json格式数据,输出到S3也是JSON格式 applog应用部分在applog目录: Dockerfile文件内容 FROM alpine RUN mkdir -p /data/logs/ COPY testlog.sh /bin/ RUN chmod 777 /bin/testlog.sh ENTRYP…

( 数组和矩阵) 485. 最大连续 1 的个数 ——【Leetcode每日一题】

❓485. 最大连续 1 的个数 难度:简单 给定一个二进制数组 nums , 计算其中最大连续 1 的个数。 示例 1: 输入:nums [1,1,0,1,1,1] 输出:3 解释:开头的两位和最后的三位都是连续 1 ,所以最大…

SimpleCG库安装使用

SimpleCG库是一个简单的Windows图形库,对GDI及窗口和消息机制进行了简单封装,从而达到类似Turbo C图形库的调用方法,目的是为了初学C语言的同学能快速上手图形界面编程。使用对象包括所有初学C语言的同学,尤其是中学生&#xff0c…

MySQL数据库,JDBC连接数据库操作流程详细介绍

前言: 在学完 MySQL 和 Java 后,我们通常会尝试使用 Java编译器 连接 MySQL数据库,从而达到使用编译器来操作数据库的效果。连接的这个过程会用 JDBC 相关知识,因此我把 JDBC 包的下载及导入流程,以及 JDBC 的使用流程…

pt13网络编程

网络编程 OSI 7层模型 建立了统一的通信标准 降低开发难度,每层功能明确,各司其职 七层模型实际规定了每一层的任务,该完成什么事情 TCP/IP模型 七层模型过于理想,结构细节太复杂在工程中应用实践难度大实际工作中以TCP/IP模型…

Java 基础入门篇(二)—— Java 基础语法

文章目录 一、注释二、字面量三、变量3.1 变量概述3.2 变量在计算机中的底层原理 四、数据类型五、关键字、标志符六、类型转换6.1 自动类型转换6.2 表达式的自动类型转换6.3 强制类型转换 七、运算符7.1 基本算数运算符7.2 符号做连接符7.3 自增自减运算符7.4 赋值运算符7.5 …

3_docker应用部署:MySQL-Tomcat-Nginx-Redis

Docker 应用部署入门 一、部署MySQL 案例需求:在Docker容器中部署MySQL,并通过外部mysql客户端操作MySQL Server。 分析: 容器内的网络服务和外部机器不能直接通信 外部机器和宿主机可以直接通信 宿主机和容器可以直接通信 当容器中的网…

【华为校招真题】分配资源ID 100% C++

【华为校招真题】分配资源ID 100% C++ 前言 如果您在准备华为的面试,期间有想了解的可以私信我,我会尽可能帮您解答,也可以给您一些建议! 本文解法非最优解(即非性能最优),不能保证通过率。 Tips1:机试为ACM 模式 你的代码需要处理输入输出,input/cin接收输入、print/…