SpringBoot+Shiro权限管理示例及总结

一、简介

  1. Spring Boot
    • Spring Boot 是一个用于简化 Spring 应用开发的框架。它通过自动配置等特性,让开发者能够快速搭建基于 Spring 的应用程序。例如,当你添加了 Web 依赖后,Spring Boot 会自动配置一个嵌入式的 Tomcat 服务器,减少了繁琐的配置过程。
    • 它遵循 “约定优于配置” 的原则,使得开发人员可以将更多精力放在业务逻辑上,而不是复杂的配置文件上。
  2. Shiro
    • Shiro 是一个强大的 Java 安全框架,它主要用于身份验证(Authentication)、授权(Authorization)、加密(Cryptography)和会话管理(Session Management)。
    • 身份验证是验证用户是否是他们声称的身份;授权是确定已认证的用户是否有权访问特定的资源;加密功能可以对数据进行加密处理,保证数据的安全性;会话管理则用于管理用户的会话状态。

二、整合步骤

  1. 创建 Spring Boot 项目
    • 可以使用 Spring Initializr(https://start.spring.io/)来创建一个基本的 Spring Boot 项目。在创建过程中,添加 Web 依赖,因为 Shiro 通常用于 Web 应用的权限管理。
    • 下载项目压缩包并解压后,用 IDE(如 IntelliJ IDEA 或 Eclipse)打开项目。
  2. 添加 Shiro 依赖
    • 在项目的pom.xml文件(如果是 Maven 项目)中添加 Shiro 依赖。
<dependency><groupId>org.apache.shiro</groupId><artifactId>shiro - spring</artifactId><version>1.9.1</version>
</dependency>
  • 对于 Gradle 项目,则在build.gradle文件中添加依赖。
implementation 'org.apache.shiro:shiro - spring:1.9.1'

配置 Shiro

  • 创建一个 Shiro 配置类,例如ShiroConfig.java
  • 配置安全管理器(SecurityManager),这是 Shiro 的核心组件
@Configuration
public class ShiroConfig {@Beanpublic SecurityManager securityManager() {DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();// 设置Realm,用于认证和授权securityManager.setRealm(myRealm());return securityManager;}// 配置自定义的Realm@Beanpublic MyRealm myRealm() {return new MyRealm();}// 配置Shiro过滤器链@Beanpublic ShiroFilterChainDefinition shiroFilterChainDefinition() {DefaultShiroFilterChainDefinition chainDefinition = new DefaultShiroFilterChainDefinition();chainDefinition.addPathDefinition("/public/**", "anon");chainDefinition.addPathDefinition("/admin/**", "authc");return chainDefinition;}// 配置Shiro过滤器工厂@Beanpublic ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager, ShiroFilterChainDefinition shiroFilterChainDefinition) {ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();shiroFilterFactoryBean.setSecurityManager(securityManager);Map<String, String> filterChainDefinitionMap = shiroFilterChainDefinition.getFilterChainMap();shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);return shiroFilterFactoryBean;}
}

在上述配置中,SecurityManager是核心,Realm用于从数据源(如数据库)获取用户信息进行认证和授权。ShiroFilterChainDefinition定义了哪些 URL 需要进行认证(authc),哪些可以匿名访问(anon

创建 Realm 实现类

自定义Realm类,例如MyRealm.java,继承自AuthorizingRealm

public class MyRealm extends AuthorizingRealm {@Overrideprotected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {// 从 principals获取用户信息,如用户名String username = (String) principals.getPrimaryPrincipal();// 根据用户名从数据库或其他数据源获取用户的角色和权限信息List<String> roles = new ArrayList<>();List<String> permissions = new ArrayList<>();// 假设从数据库查询角色和权限的方法roles = userService.getRolesByUsername(username);permissions = userService.getPermissionsByUsername(username);SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();authorizationInfo.setRoles(roles);authorizationInfo.setStringPermissions(new LinkedHashSet<>(permissions));return authorizationInfo;}@Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {// 从 token获取用户名String username = (String) token.getPrincipal();// 根据用户名从数据库获取用户密码String password = userService.getPasswordByUsername(username);if (password == null) {return null;}SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(username, password, getName());return authenticationInfo;}
}
  • doGetAuthorizationInfo方法中,根据用户信息获取用户的角色和权限,用于授权。在doGetAuthenticationInfo方法中,根据用户名获取密码用于认证用户身份。

总结

Spring Boot 与 Shiro 的结合为 Java 应用提供了强大且便捷的权限管理解决方案。Shiro 作为安全框架,在身份验证、授权、加密和会话管理方面表现卓越,而 Spring Boot 简化了配置和开发流程,二者相辅相成。

  • 身份验证方面:通过自定义 Realm 从数据源(如数据库)获取用户信息,验证用户输入的用户名和密码是否匹配,确保用户是其声称的身份。例如,在用户登录过程中,Shiro 会根据用户输入的凭证在 Realm 中进行查找和验证。
  • 授权方面:依据用户的角色和权限信息,确定已认证用户是否有权访问特定资源。可以基于角色(如@RequiresRoles注解)或权限(如@RequiresPermissions注解)来控制对 Controller 方法的访问,精细地划分系统功能的访问权限。
  • 加密方面:Shiro 支持多种加密算法,可对用户密码等敏感信息进行加密存储和处理,保障数据在传输和存储过程中的安全性,如使用 BCrypt 算法对密码加密。
  • 会话管理方面:负责管理用户的会话状态,包括会话的创建、维护和销毁,确保用户在整个交互过程中的状态一致性。性能优化
    • 缓存机制:当系统用户量和权限规则较多时,为了避免频繁地从数据库查询用户权限信息,可以引入缓存机制。例如,对用户的角色和权限信息进行缓存,减少数据库查询次数,提高系统性能。
    • 合理设计数据库查询:在 Realm 中查询用户信息时,优化数据库查询语句和逻辑,避免复杂的查询和不必要的查询操作,提高查询效率。

总之,Spring Boot + Shiro 权限管理方案为 Java 应用开发提供了一个可靠、灵活且高效的权限管理途径,但在实际应用中需要充分考虑安全和性能等多方面因素,以确保系统的稳定运行和数据安全。

 

 

 

 

 

 

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

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

相关文章

Liunx:进程控制

进程终止 三种场景&#xff0c;进程结束结果正确&#xff0c;进程结束不正确&#xff0c;异常终止。 进程的退出码&#xff0c;也就是return&#xff0c;表征着进程运行结果是否正常&#xff0c;return 返回值被父进程接收。return 0表示进程运行结束并且结果正确。他是给用户的…

C++builder中的人工智能(12):了解ELU(Exponential Linear Unit)——人工神经网络中的激活函数

在这篇文章中&#xff0c;我们将解释什么是指数线性单元&#xff08;ELU&#xff09;&#xff0c;以及如何利用ELU激活函数。通过学习这些知识&#xff0c;你将能够使用C软件创建C应用程序。 我们需要了解哪些关于激活函数的知识&#xff1f; 激活函数&#xff08;phi()&#…

从0开始学习机器学习--Day19--学习曲线

一般来说&#xff0c;如果一个算法的表现不理想&#xff0c;那么多半是因为出现了欠拟合或过拟合问题&#xff0c;这种时候我们要做的就是搞清楚出现的是偏差问题还是方差问题&#xff0c;亦或是二者皆有&#xff0c;这有助于我们精准定位问题所在。 之前&#xff0c;我们发现…

豆包大模型团队开源RLHF框架,破解强化学习训练部署难题

1. 引言 1.1 强化学习 强化学习&#xff08;Reinforcement Learning, RL&#xff09;是与监督学习和无监督学习并列的一种机器学习方法&#xff0c;其用于描述和解决智能体&#xff08;agent&#xff09;在与环境的交互过程中通过学习策略以达成回报最大化或实现特定目标的问题…

练习LabVIEW第四十三题

学习目标&#xff1a; 模拟红绿灯&#xff0c;红灯亮十秒&#xff0c;绿灯亮五秒&#xff0c;交替&#xff0c;并用波形图将波形显示 开始编写&#xff1a; 前面板 两个指示灯&#xff0c;一个红色&#xff0c;一个绿色&#xff0c;一个波形图&#xff1b; 程序框图 创建…

css:基础

前言 我们之前其实也可以写出一个看起来算是一个网页的网页&#xff0c;为什么我们还要学css&#xff1f; CSS&#xff08;Cascading Style Sheets&#xff09;也叫层叠样式表&#xff0c;是负责美化的&#xff0c;我们之前说html就是一个骨架&#xff0c;css就可以用来美化网…

解析 “Cookies Not Marked as HttpOnly” 漏洞

一、引言 在 Web 应用安全领域&#xff0c;Cookies 相关的漏洞一直是备受关注的问题。其中&#xff0c;“Cookies Not Marked as HttpOnly” 漏洞可能会对用户数据安全和网站的正常运行造成潜在威胁。本文将详细介绍这个漏洞&#xff0c;包括其原理、影响、检测方法以及修复措…

基于MATLAB DCT域图像水印技术

1数字水印技术的概念和特点 数字水印&#xff08;Digital Watermark&#xff09;技术是将与多媒体内容相关或不相关的一些标示信息直接嵌入多媒体内容当中&#xff0c;但不影响原内容的使用价值&#xff0c;并不容易被人的知觉系统觉察或注意到。通过这些隐藏在多媒体内容中的…

【语义分割|代码解析】CMTFNet-2: CNN and Multiscale Transformer Fusion Network 用于遥感图像分割!

【语义分割|代码解析】CMTFNet-2: CNN and Multiscale Transformer Fusion Network 用于遥感图像分割&#xff01; 【语义分割|代码解析】CMTFNet-2: CNN and Multiscale Transformer Fusion Network 用于遥感图像分割&#xff01; 文章目录 【语义分割|代码解析】CMTFNet-2: …

在暗处执着生长,终有一日馥郁传香

总有人说很孤独&#xff0c;一个人吃饭&#xff0c;一个人上班&#xff0c;一个人逛街&#xff1b; 总有人又说享受孤独&#xff0c;面对时间&#xff0c;迎接苦难&#xff0c;战胜痛苦&#xff1b; 可没人说这些的大前提是你要有信念支撑啊&#xff0c;如果干完了上面的所有&a…

揭秘集装箱箱号自动识别原理,箱号识别算法

集装箱箱号自动识别算法是一种高效且实用的软件工具。它利用相机、手机或其他摄像头捕获集装箱箱号图像&#xff0c;并通过深度学习的OCR&#xff08;光学字符识别&#xff09;识别技术对集装箱号码进行准确识别。要想进行集装箱箱号识别&#xff0c;需要以下几个基本步骤&…

JavaScript 网页设计详解教程

JavaScript 网页设计详解教程 引言 JavaScript 是一种广泛使用的编程语言&#xff0c;主要用于网页开发。它使得网页具有动态交互性&#xff0c;能够响应用户的操作。随着前端开发的不断发展&#xff0c;JavaScript 已成为现代网页设计中不可或缺的一部分。本文将详细介绍 Ja…

高新技术企业知识库搭建:在创新创业中的支撑作用

在快速迭代的科技时代&#xff0c;高新技术企业&#xff08;以下简称“高企”&#xff09;作为推动经济社会发展的核心力量&#xff0c;正面临着前所未有的创新挑战与机遇。知识库&#xff0c;作为信息时代的智慧宝库&#xff0c;不仅承载着企业内部的宝贵知识与经验&#xff0…

ReposVul: A Repository-Level High-Quality Vulnerability Dataset 论文阅读

本文发表于 ICSE2024 会议中。 引入 在过去的漏洞数据库中&#xff0c;主要存在以下几种问题&#xff1a; 无效补丁&#xff08;Tangled Patches&#xff09;&#xff1a;针对某个漏洞的补丁无法正确修复该漏洞缺乏跨函数漏洞&#xff08;Inter-procedural Vulnerabilities&…

【图解版】力扣第70题:爬楼梯

推理出状态表达式 f(5)表示到达第5层&#xff0c;所有可能的方法数。 到达第5层&#xff0c;有可能是从第4层走一步上来&#xff0c;也有可能是从第3层走两步上来。所以我们可以慢慢延伸&#xff0c;画出上面&#x1f446;&#x1f3fb;的图。 从图中&#xff0c;我们可以看到…

使用Docker快速部署FastAPI Web应用

Docker是基于 Linux 内核的cgroup、namespace以及 AUFS 类的Union FS 等技术&#xff0c;对进程进行封装隔离&#xff0c;一种操作系统层面的虚拟化技术。Docker中每个容器都基于镜像Image运行&#xff0c;镜像是容器的只读模板&#xff0c;容器是模板的一个实例。镜像是分层结…

QT——自定义控件绘图

一.QPaintEvent绘图事件 QPaintEvent是QT中一个重要的类&#xff0c;专门用于绘图事件。当QT视图组件需要重绘制自己的一部分时&#xff0c;就会产生该事件&#xff0c;通常发生在以下几种情况。 窗口第一次显示时&#xff1a;当窗口或控件第一次出现在屏幕中&#xff0c;系统…

Java项目实战II基于Java+Spring Boot+MySQL的高校办公室行政事务管理系统(源码+数据库+文档)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 在高等教育…

非计算机背景但是想从事医学AI研究,需要掌握的编程语言|个人观点·24-11-08

小罗碎碎念 目前&#xff0c;我们从事医学AI研究的&#xff0c;接触的最多的两种编程语言应该就是R和Python了。那么初学者很容易提出一个疑问&#xff0c;**我想从事医学AI相关的研究的话&#xff0c;应该学哪些编程语言呢&#xff1f;**在文章的开头&#xff0c;我可以先给出…

arkUI:Flex弹性布局的各个属性

arkUI&#xff1a;Flex弹性布局的简单使用 1 主要内容说明2 相关内容2.1 Flex弹性布局的方向2.1.1 源码1的简答说明2.1.2 源码1 &#xff08;Flex弹性布局的方向&#xff09;2.1.3 源码1运行效果2.1.3.1 当direction: FlexDirection.RowReverse2.1.3.2 当direction: FlexDirect…