【权限管理】Apache Shiro学习教程
Apache Shiro 是一个功能强大且灵活的安全框架,主要用于身份认证(Authentication)、授权(Authorization)、会话管理(Session Management)和加密(Cryptography)。它旨在为 Java 应用程序提供简单、强大且高效的安全功能,适用于从 Web 应用到企业级应用的多种场景。
在本教程中,我们将通过 Apache Shiro 的各个方面,详细介绍如何配置、使用和扩展该框架。
一、Apache Shiro 概述
Apache Shiro 提供了一套用于实现安全管理的完整解决方案,核心功能包括:
1. 认证(Authentication):用于确认用户的身份
Shiro 可以通过多种方式对用户进行认证。常见的认证方式包括基于用户名和密码的认证、集成 LDAP 服务器或使用其他外部身份验证系统。
2. 授权(Authorization):用于控制用户的访问权限
Shiro 提供了一种灵活的权限控制模型,可以基于用户的角色或特定的权限进行访问控制。它支持基于角色的访问控制(RBAC),还允许你为特定用户或资源设置细粒度的权限。
3. 会话管理(Session Management):管理用户会话
Shiro 提供了一种简便的方式来管理会话。与传统的 Servlet 容器会话不同,Shiro 可以在应用层级进行会话管理。它支持多种会话存储策略,并且会话数据可以自动持久化。
4. 加密(Cryptography):为应用程序提供数据保护
Shiro 包含加密 API,用于处理加密和解密、哈希处理等。它支持常见的加密算法(如 AES、RSA、SHA-256 等)并且可以方便地用于密码存储和安全通信。
Shiro 的设计理念是简单易用且高度可扩展。与其他 Java 安全框架相比,Shiro 的 API 设计简洁明了,配置简单,适合初学者和开发人员快速上手。开发人员只需关注核心的认证和授权逻辑,而无需过多关心底层的实现细节。Shiro 提供了许多可以定制和扩展的接口,允许开发人员根据应用需求来实现自定义的身份验证和授权逻辑。比如,用户可以自定义 Realm,以便与不同的数据源进行集成。同时它支持多种存储后端,如数据库、LDAP、文件系统等。
二、Apache Shiro 核心组件
- SecurityManager:核心接口,负责协调所有安全相关的操作(认证、授权、会话管理)。
- Subject:表示当前用户或应用的主体,提供身份验证和权限验证等功能。
- Realm:负责连接数据源(如数据库、LDAP)进行用户身份验证和权限验证的组件。它是 Shiro 中的“数据源”层。
- Session:用于管理用户会话的信息,可以与 Web 会话结合,也可以独立运行。
- Authenticator 和 Authorizer:分别负责认证和授权的逻辑实现。
- Cryptography:Shiro 提供了一套加密工具,用于保护敏感信息(如密码)。
三、使用 Apache Shiro 的基本步骤
1. 引入 Apache Shiro 依赖
Maven 依赖:
在你的 pom.xml
文件中添加 Shiro 依赖:
<dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-core</artifactId><version>1.8.0</version> <!-- 选择适合的版本 -->
</dependency>
Gradle 依赖:
implementation 'org.apache.shiro:shiro-core:1.8.0'
2. 配置 Shiro
Shiro 的配置可以通过 XML 文件或 Java 配置类来实现。下面是通过 Java 配置类的示例:
@Configuration
@EnableAspectJAutoProxy
public class ShiroConfig {@Beanpublic SecurityManager securityManager() {DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();securityManager.setRealm(myRealm());return securityManager;}@Beanpublic Realm myRealm() {return new MyRealm();}@Beanpublic ShiroFilterFactoryBean shiroFilterFactoryBean() {ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean();bean.setSecurityManager(securityManager());Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();filterChainDefinitionMap.put("/login", "anon"); // 公开的路径filterChainDefinitionMap.put("/**", "authc"); // 需要认证的路径bean.setFilterChainDefinitionMap(filterChainDefinitionMap);return bean;}
}
3. 创建自定义 Realm
Realm
是 Shiro 的关键组成部分,它负责从数据源获取用户身份信息(如用户名、密码等)并验证。
public class MyRealm extends AuthorizingRealm {@Overrideprotected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {String username = (String) principals.getPrimaryPrincipal();Set<String> roles = getRoles(username); // 从数据库获取角色Set<String> permissions = getPermissions(username); // 获取权限SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();authorizationInfo.setRoles(roles);authorizationInfo.setStringPermissions(permissions);return authorizationInfo;}@Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {String username = (String) token.getPrincipal();String password = getPassword(username); // 从数据库获取密码if (password == null) {throw new UnknownAccountException("用户不存在");}return new SimpleAuthenticationInfo(username, password, getName());}private Set<String> getRoles(String username) {// 查询数据库,获取角色}private Set<String> getPermissions(String username) {// 查询数据库,获取权限}private String getPassword(String username) {// 查询数据库,获取密码}
}
4. 配置 Shiro 的过滤器
Shiro 使用过滤器来管理访问控制。通过 ShiroFilterFactoryBean
配置不同的 URL 路径与过滤器的关系。例如,指定哪些路径需要认证,哪些路径是公开的。
@Bean
public ShiroFilterFactoryBean shiroFilterFactoryBean() {ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();shiroFilterFactoryBean.setSecurityManager(securityManager());Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();filterChainDefinitionMap.put("/login", "anon"); // 登录页面可以匿名访问filterChainDefinitionMap.put("/logout", "logout"); // 登出filterChainDefinitionMap.put("/**", "authc"); // 其他路径需要认证shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);return shiroFilterFactoryBean;
}
5. 集成 Shiro 的认证与授权
登录验证
Shiro 提供了非常简单的 API 来执行身份验证。用户可以使用 Subject
来进行身份验证操作:
Subject currentUser = SecurityUtils.getSubject();
UsernamePasswordToken token = new UsernamePasswordToken(username, password);
try {currentUser.login(token); // 执行登录
} catch (AuthenticationException e) {// 登录失败处理
}
访问控制(授权)
Shiro 使用权限控制来决定用户是否有权限执行特定的操作。例如:
Subject currentUser = SecurityUtils.getSubject();
if (currentUser.hasRole("admin")) {// 执行管理员操作
}
if (currentUser.isPermitted("user:update")) {// 执行更新操作
}
6. 会话管理
Shiro 提供了一个轻量级的会话管理机制,可以用于 Web 应用或任何 Java 应用中的会话管理。Shiro 会自动管理用户会话,用户的状态保存在一个 Session
中,应用可以通过 SecurityUtils.getSubject().getSession()
来获取。
Subject currentUser = SecurityUtils.getSubject();
currentUser.getSession().setAttribute("someKey", "someValue");
Object value = currentUser.getSession().getAttribute("someKey");
7. 加密和密码处理
Shiro 提供了内置的加密和密码哈希机制,用于安全地存储和验证密码。你可以使用 SimpleHash
和 Sha256Hash
类来对密码进行哈希操作:
String password = "myPassword";
String salt = "mySalt"; // 添加盐值
SimpleHash hash = new SimpleHash("SHA-256", password, salt);
String hashedPassword = hash.toHex();
通过这种方式,密码可以在数据库中以哈希值的形式存储,而不是明文密码。
四、进阶功能与最佳实践
- 集成与 Spring Security:Shiro 和 Spring Security 都是常用的 Java 安全框架,可以通过配置和扩展将两者结合使用,提升系统的安全性。
- 自定义认证和授权逻辑:通过自定义
Realm
,你可以根据自己的业务需求实现更加复杂的认证和授权逻辑。 - 多种认证机制:Shiro 支持各种认证方式,包括表单认证、Basic 认证、JWT 等。
- 跨域认证:Shiro 允许在分布式系统中使用共享会话,支持跨域认证。
- 持久化会话:Shiro 允许将用户会话存储在数据库或缓存中,以支持分布式会话管理。
五、总结
Apache Shiro 是一个功能丰富、灵活且易于使用的安全框架,适用于各种类型的 Java 应用。通过简单的配置和扩展,你可以快速集成认证、授权、会话管理和加密功能,并能够满足复杂的安全需求。Shiro 适用于从小型应用到大型企业系统的各类场景,是构建安全系统的理想选择。
相关文章:
![](https://www.ngui.cc/images/no-images.jpg)
【权限管理】Apache Shiro学习教程
Apache Shiro 是一个功能强大且灵活的安全框架,主要用于身份认证(Authentication)、授权(Authorization)、会话管理(Session Management)和加密(Cryptography)。它旨在为…...
![](https://i-blog.csdnimg.cn/direct/7c7eadd22491480e94c37ca70c48a27a.png)
9.4 visualStudio 2022 配置 cuda 和 torch (c++)
一、配置torch 1.Libtorch下载 该内容看了【Libtorch 一】libtorchwin10环境配置_vsixtorch-CSDN博客的博客,作为笔记用。我自己搭建后可以正常运行。 下载地址为windows系统下各种LibTorch下载地址_libtorch 百度云-CSDN博客 下载解压后的目录为: 2.vs…...
![](https://www.ngui.cc/images/no-images.jpg)
python特殊参数
一、默认值参数和关键字参数 1.默认值参数 形参设定默认值 称为 默认参数。调用函数时,可以使用比定义时更少的参数。调用函数时,如果没有传入默认参数对应的实参,则实参使用默认值默认参数在调用的时候可以不传递,也可以传递 …...
![](https://i-blog.csdnimg.cn/direct/8d149a94722a4ce7b815584309d571da.png)
Ubuntu系统Qt的下载、安装及入门使用,图文详细,内容全面
文章目录 说明1 在线安装2 离线安装3 使用Qt Creator创建Qt应用程序并构建运行补充补充一:注册Qt账号 说明 本文讲解Ubuntu系统下安装Qt,包括在线安装和离线安装两种方式,内容充实细致,话多但是没有多余(不要嫌我啰嗦…...
![](https://www.ngui.cc/images/no-images.jpg)
elasticsearch集群部署
一、创建 elasticsearch-cluster 文件夹 创建 elasticsearch-7.6.2-cluster文件夹 修改服务es服务文件夹为node-001 修改config/elasticsearch.yml 配置文件 # Elasticsearch Configuration # # NOTE: Elasticsearch comes with reasonable defaults for most settings. # …...
![](https://i-blog.csdnimg.cn/direct/69e51d60404f406a9734e3e2bde717b4.png)
初学stm32 --- DAC模数转换器工作原理
目录 什么是DAC? DAC的特性参数 STM32各系列DAC的主要特性 DAC框图简介(F1/F4/F7) 参考电压/模拟部分电压 触发源 关闭触发时(TEN0)的转换时序图 DMA请求 DAC输出电压 什么是DAC? DAC,全称:Digital…...
![](https://i-blog.csdnimg.cn/direct/73e0b2be79c2414aaafecbcdd6227f65.png#pic_center)
保证Mysql数据库到ES的数据一致性的解决方案
文章目录 1.业务场景介绍1.1 需求分析1.2 技术实现方案 2.业界常用数据一致性方案分析2.1 同步双写方案2.2 MQ异步双写方案2.3 扫表定期同步方案2.4 监听binlog同步方案 1.业务场景介绍 1.1 需求分析 某知名的在线旅游平台,在即将到来的春季促销活动之前ÿ…...
![](https://www.ngui.cc/images/no-images.jpg)
Flutter Xcode 16+ iOS 18.1 使用image_pickers无法弹出选择图片的视图问题
解决 Flutter Xcode 16 使用 image_pickers 无法弹出选择图片视图的问题 在开发 Flutter 应用时,图片选择功能是常见的需求之一。image_pickers 库因其便捷性和功能丰富性,成为了许多开发者的选择。然而,随着 Xcode 版本的不断更新ÿ…...
![](https://i-blog.csdnimg.cn/direct/bcf95acea7e7460ca52a5778ab3646db.png)
socket网络编程-TC/IP方式
网络编程 1.概念:两台设备之间通过网络数据传输。 2.网络通信:将数据通过网络从一台设备传输另外一台设备。 3.java.net包下提供了一系列的类和接口,提供程序员使用,完成网络通信。 TCP和UDP TCP协议: 1.使用TCP协…...
![](https://i-blog.csdnimg.cn/direct/698ec94684d04cec97d1db80a06b92d7.png)
《分布式光纤测温:解锁楼宇安全的 “高精度密码”》
在楼宇建筑中,因其内部空间庞大,各类电器设施众多,如何以一种既高效又稳定,兼具低成本与高覆盖特性的方式,为那些关键线路节点开展温度监测,是目前在安全监测领域一项重点研究项目,而无锡布里渊…...
![](https://www.ngui.cc/images/no-images.jpg)
C语言基本知识复习浓缩版:数组
所谓数组(Array),就是一系列数据的集合。这些数据具有相同的类型,并且在内存中挨着存放,彼此之间没有缝隙。换句话说,数组用来存放多份数据,但是它有两个要求: 这些数据的类型必须相…...
![](https://www.ngui.cc/images/no-images.jpg)
Python贪心
贪心 贪心:把整体问题分解成多个步骤,在每个步骤都选取当前步骤的最优方案,直至所有步骤结束;每个步骤不会影响后续步骤核心性质:每次采用局部最优,最终结果就是全局最优如果题目满足上述核心性质…...
![](https://www.ngui.cc/images/no-images.jpg)
rk3568 内核态OOM内存泄漏kmemleak使用
1,配置,修改\kernel\arch\arm64\configs\rockchip_linux_defconfig,修改后查看.config. larkubuntu:~/Public/rk356x-linux/rk356x-linux/kernel$ cat .config | grep -i kmemleak CONFIG_HAVE_DEBUG_KMEMLEAKy CONFIG_DEBUG_KMEMLEAKy CONFI…...
![](https://i-blog.csdnimg.cn/direct/eb14264800b347b7907726008f73ca67.png)
ASP.NET Core - 日志记录系统(二)
ASP.NET Core - 日志记录系统(二) 2.4 日志提供程序2.4.1 内置日志提供程序2.4.2 源码解析 本篇接着上一篇 ASP.NET Core - 日志记录系统(一) 往下讲,所以目录不是从 1 开始的。 2.4 日志提供程序 2.4.1 内置日志提供程序 ASP.NET Core 包括…...
![](https://www.ngui.cc/images/no-images.jpg)
阿里云直播互动Web
官方文档:互动消息Web端集成方法_视频直播(LIVE)-阿里云帮助中心 以下是代码实现: <!-- 引入阿里云互动文件 --> <script src"https://g.alicdn.com/code/lib/jquery/3.7.1/jquery.min.js"></script> <script src&quo…...
![](https://i-blog.csdnimg.cn/direct/c2575be9d11840edb4ab7d99e4d932a2.jpeg)
解锁无证身份核验:开启便捷安全新征程
在当今快速发展的数字化时代,身份核验作为确保信息安全与交易诚信的基石,正经历着前所未有的变革。传统的身份核验方式,如携带身份证件进行现场验证,虽在一定程度上保障了安全,却也带来了诸多不便。随着科技的进步&…...
![](https://i-blog.csdnimg.cn/direct/391dfadcfe0e42d2b425ece4d551102b.png)
[DO374] Ansible 配置文件
[DO374] Ansible 配置文件 1. 配置文件位置2. 配置文件3. Ansible 配置4. Ansible的Ad-hoc5. Ansible 模块6. playbook段落7. 任务执行后续8. Ansible 变量8.1 ansible 变量的定义8.1.1 主机变量8.1.2 主机组变量 8.2 vars的循环 9. Ansible Collection10. Ansible-galaxy 安装…...
![](https://i-blog.csdnimg.cn/direct/e63a5d9b651c405ea751640283fbc439.webp#pic_center)
【杂谈】-50+个生成式人工智能面试问题(四)
7、生成式AI面试问题与微调相关 Q23. LLMs中的微调是什么? 答案:虽然预训练语言模型非常强大,但它们并不是任何特定任务的专家。它们可能对语言有惊人的理解能力,但仍需要一些LLMs微调过程,开发者通过这个过程提升它…...
![](https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=.%2FRuoYi%20Cloud%E9%A1%B9%E7%9B%AE%E5%88%86%E6%9E%90%2Fimage-20250108122140978.png&pos_id=img-oLtXQt9w-1736322984344)
RuoYi Cloud项目解读【四、项目配置与启动】
四、项目配置与启动 当上面环境全部准备好之后,接下来就是项目配置。需要将项目相关配置修改成当前相关环境。 1 后端配置 1.1 数据库 创建数据库ry-cloud并导入数据脚本ry_2024xxxx.sql(必须),quartz.sql(可选&…...
![](https://i-blog.csdnimg.cn/img_convert/2f2f9c40bc61e3b70d0529b67917701a.png)
51c~Pytorch~合集5
我自己的原文哦~ https://blog.51cto.com/whaosoft/13059544 一、PyTorch DDP 正在郁闷呢 jetson nx 的torchvision安装~~ 自带就剩5g 想弄到ssd 项目中的 venv中又 cuda.h没有... 明明已经装好什么都对 算了说今天主题 啊对 还是搬运啊 学习之工具人而已 勿怪 Distrib…...
![](https://i-blog.csdnimg.cn/direct/59c9bfd1d872433190a5d9eea15de04b.png#pic_center)
【芯片封测学习专栏 -- 什么是 Chiplet 技术】
请阅读【嵌入式开发学习必备专栏 Cache | MMU | AMBA BUS | CoreSight | Trace32 | CoreLink | ARM GCC | CSH】 文章目录 OverviewChiplet 背景UCIeChiplet 的挑战 Overview Chiplet 又称为小芯片。该技术通过将大型SoC划分为更小的芯片,使得每个部分都能采用不同…...
![](https://www.ngui.cc/images/no-images.jpg)
Java SpringBoot + Vue + Uniapp 集成JustAuth 最快实现多端三方登录!(QQ登录、微信登录、支付宝登录……)
注:本文基于 若依 集成just-auth实现第三方授权登录 修改完善,所有步骤仅代表本人如下环境亲测可用,其他环境需自辩或联系查看原因! 系统环境 运行系统:Windows10专业版、Linux Centos7.6 Java 版本:1.8.0_…...
![](https://i-blog.csdnimg.cn/direct/043a954910414c2aa1c3ef8372d550f4.png)
支持向量回归(SVR:Support Vector Regression)用于A股数据分析、预测
简单说明 支持向量回归是一种用来做预测的数学方法,属于「机器学习」的一种。 它的目标是找到一条「最合适的线」,能够大致描述数据点的趋势,并允许数据点离这条线有一定的误差(不要求所有点都完全落在这条线上)。 可以把它想象成:找到一条「宽带」或「隧道」,大部分…...
![](https://i-blog.csdnimg.cn/direct/12f90d042b2d41e4931da9f4035e31cf.png)
ZYNQ初识10(zynq_7010)UART通信实验
基于bi站正点原子讲解视频: 系统框图(基于串口的数据回环)如下: 以下,是串口接收端的波形图,系统时钟和波特率时钟不同,为异步时钟,,需要先延时两拍,将时钟同…...
![](https://i-blog.csdnimg.cn/direct/e2853e7c31af4e36947826128e7f2162.png)
专题 - STM32
基础 基础知识 STM所有产品线(列举型号): STM产品的3内核架构(列举ARM芯片架构): STM32的3开发方式: STM32的5开发工具和套件: 若要在电脑上直接硬件级调试STM32设备,则…...
![](https://i-blog.csdnimg.cn/direct/ed9305fc6ca6436fa8a6fb86f9c1c443.png)
2 XDMA IP中断
三种中断 1. Legacy 定义:Legacy 中断是传统的中断处理方式,使用物理中断线(例如 IRQ)来传递中断信号。缺点: 中断线数量有限,通常为 16 条,限制了可连接设备的数量。中断处理可能会导致中断风…...
![](https://img-blog.csdnimg.cn/ea69961097f74dc181f3c62df5a3b04f.png)
自然语言转 SQL:通过 One API 将 llama3 模型部署在 Bytebase SQL 编辑器
使用 Open AI 兼容的 API,可以在 Bytebase SQL 编辑器中使用自然语言查询数据库。 出于数据安全的考虑,私有部署大语言模型是一个较好的选择 – 本文选择功能强大的开源模型 llama3。 由于 OpenAI 默认阻止出站流量,为了简化网络配置&#…...
![](https://www.ngui.cc/images/no-images.jpg)
抖音矩阵是什么
抖音矩阵是指在同一品牌或个人IP下,通过创建多个不同定位的抖音账号(如主号、副号、子号等),形成一个有机的整体,以实现多维度、多层次的内容覆盖和用户互动。以下是关于抖音矩阵的详细介绍: 抖音矩阵的类…...
![](https://i-blog.csdnimg.cn/img_convert/cf844e7d2dd2576a9be1fe784f408a9c.png)
怎么抓取ios 移动app的https请求?
怎么抓取IOS应用程序里面的https? 这个涉及到2个问题 1.电脑怎么抓到IOS手机流量? 2.HTTPS怎么解密? 部分app可以使用代理抓包的方式,但是正式点的app用代理抓包是抓不到的,例如pin检测,证书双向校验等…...
![](https://www.ngui.cc/images/no-images.jpg)
pyqt鸟瞰
QApplication是Qt框架中的一个类,专门用于管理基于QWidget的图形用户界面(GUI)应用程序的控制流和主要设置。QApplication类继承自QGuiApplication,提供了许多与GUI相关的功能,如窗口系统集成、事件处理等。 QAppli…...
![](/images/no-images.jpg)
樟木头镇做网站/手机如何建立网站
Oracle 体系结构(29)—— Oracle 的数据字典之(三):和用户管理有关的数据字典 Oracle 和用户管理相关的数据字典主要有三个:DBA_USERS、USER_USERS、ALL_USERS 一、DBA_USERS 该数据字典用于查询 Oracle…...
![](/images/no-images.jpg)
wordpress小工具最近评论/百度网页链接
def ChooseSort(R): for i in range(0,len(R),1):#控制循环的次数 ki for j in range(i1,len(R),1): if R[j]<R[k]: kj if k!!: R[k],R[i] R[i],R[k] print R 转载于:https://www.cnblogs.com/linbinqiang/p/5123462.html...
![](https://img-blog.csdnimg.cn/img_convert/68ba0123b6110e73d684b16348fa2106.gif)
南宁网站制作超薄网络/建站abc
在做开源项目的时候,想传一个gif效果图上去。但是,要有连贯的动画效果。所以,就想到先录制视频,然后视频转gif。但是,用第三录屏软件总是不完美。那么,怎么办呢?android4.4 提供了自带录屏工具&…...
![](/images/no-images.jpg)
网站开发框架的主要作用/微信软文是什么意思
rpm -i --test abc.rpm...
![](https://img2018.cnblogs.com/blog/1636037/201904/1636037-20190414205013583-631744419.png)
真人做a视频网站/网络营销网站建设案例
plantuml类图绘制方法的学习: 1.关于类图的学习: 类图显示了系统的静态结构。 类:类图中的主要元素,用矩形表示。矩形的上层表示类名、中层表示属性、下层表示方法。 类之间的关系:关联、依赖、聚集、泛化和实现五种。…...
![](https://images2018.cnblogs.com/blog/956663/201805/956663-20180510104424647-1512746647.png)
企业品牌网站建设怎么做/百度关键词相关性优化软件
-----------------------往期----------------------------- vuex - 学习日记 vuex - 辅助函数学习 vuex - 常用命令学习及用法整理 vuex - 项目结构目录及一些简单配置 -----------------------正文----------------------------- 首先,目录结构依然如下࿱…...