news 2026/4/27 10:23:50

Shiro权限管理:Spring Boot集成Shiro实现安全控制终极指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Shiro权限管理:Spring Boot集成Shiro实现安全控制终极指南

Shiro权限管理:Spring Boot集成Shiro实现安全控制终极指南

【免费下载链接】spring-boot-demo🚀一个用来深入学习并实战 Spring Boot 的项目。项目地址: https://gitcode.com/gh_mirrors/sp/spring-boot-demo

在现代Web应用开发中,安全控制是不可或缺的一环。Apache Shiro作为一款功能强大且易于使用的Java安全框架,为开发者提供了身份认证、授权、加密和会话管理等核心功能。本指南将带你快速掌握如何在Spring Boot项目中集成Shiro,实现企业级的安全控制方案。

为什么选择Shiro进行权限管理?

Shiro框架以其简洁的API和灵活的架构而广受欢迎。与其他安全框架相比,Shiro具有以下优势:

  • 易于理解和使用:Shiro的API设计直观,学习曲线平缓,即使是安全领域的新手也能快速上手
  • 全面的安全功能:提供身份认证、授权、会话管理、密码加密等一站式安全解决方案
  • 轻量级设计:核心组件小巧,不会给项目带来过多依赖负担
  • 灵活的扩展机制:支持自定义 realms、过滤器和认证策略,满足复杂业务需求

在Spring Boot项目中集成Shiro,可以轻松实现细粒度的权限控制,保护敏感资源,防止未授权访问。

快速开始:Spring Boot集成Shiro的步骤

1. 添加Shiro依赖

首先,需要在项目的pom.xml文件中添加Shiro相关依赖。在demo-rbac-shiro模块中,我们可以找到以下关键依赖配置:

<dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring-boot-starter</artifactId> <version>1.7.1</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency>

这些依赖包括Shiro的Spring Boot启动器、Web支持以及MySQL数据库驱动,为后续的安全配置和数据库交互奠定基础。

2. 配置Shiro核心组件

Shiro的核心配置主要包括SecurityManager、Realm和过滤器链。在demo-rbac-shiro模块中,我们可以找到ShiroConfig类,其中定义了这些关键组件:

@Configuration public class ShiroConfig { @Bean public SecurityManager securityManager(UserRealm userRealm) { DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); securityManager.setRealm(userRealm); return securityManager; } @Bean public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) { ShiroFilterFactoryBean filterFactoryBean = new ShiroFilterFactoryBean(); filterFactoryBean.setSecurityManager(securityManager); // 配置URL过滤器规则 Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>(); filterChainDefinitionMap.put("/login", "anon"); filterChainDefinitionMap.put("/logout", "logout"); filterChainDefinitionMap.put("/**", "authc"); filterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap); filterFactoryBean.setLoginUrl("/login"); filterFactoryBean.setSuccessUrl("/index"); filterFactoryBean.setUnauthorizedUrl("/403"); return filterFactoryBean; } }

这段配置定义了Shiro的核心安全管理器,设置了自定义的UserRealm,并配置了URL访问规则。通过过滤器链,我们可以控制哪些资源需要认证,哪些资源可以匿名访问。

3. 实现自定义Realm

Realm是Shiro与应用安全数据之间的桥梁。在demo-rbac-shiro模块中,UserRealm类实现了认证和授权逻辑:

public class UserRealm extends AuthorizingRealm { @Autowired private UserService userService; @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { // 实现用户认证逻辑 String username = (String) token.getPrincipal(); User user = userService.findByUsername(username); if (user == null) { throw new UnknownAccountException("用户名不存在"); } return new SimpleAuthenticationInfo(user, user.getPassword(), getName()); } @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { // 实现用户授权逻辑 User user = (User) principals.getPrimaryPrincipal(); SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(); // 添加用户角色 user.getRoles().forEach(role -> { info.addRole(role.getName()); // 添加角色权限 role.getPermissions().forEach(permission -> { info.addStringPermission(permission.getName()); }); }); return info; } }

在这个Realm实现中,我们通过UserService从数据库获取用户信息,并分别实现了认证(doGetAuthenticationInfo)和授权(doGetAuthorizationInfo)方法。认证方法负责验证用户身份,授权方法则为用户分配相应的角色和权限。

4. 设计权限数据库表结构

Shiro的RBAC(基于角色的访问控制)模型需要相应的数据库表结构支持。在demo-rbac-shiro模块的sql目录下,shiro.sql文件定义了所需的表结构:

-- 用户表 CREATE TABLE user ( id BIGINT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50) NOT NULL UNIQUE, password VARCHAR(100) NOT NULL, salt VARCHAR(50) NOT NULL, status TINYINT DEFAULT 1, created_time DATETIME DEFAULT CURRENT_TIMESTAMP ); -- 角色表 CREATE TABLE role ( id BIGINT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50) NOT NULL UNIQUE, description VARCHAR(200), created_time DATETIME DEFAULT CURRENT_TIMESTAMP ); -- 权限表 CREATE TABLE permission ( id BIGINT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(100) NOT NULL UNIQUE, resource VARCHAR(200) NOT NULL, action VARCHAR(50) NOT NULL, created_time DATETIME DEFAULT CURRENT_TIMESTAMP ); -- 用户角色关联表 CREATE TABLE user_role ( user_id BIGINT NOT NULL, role_id BIGINT NOT NULL, PRIMARY KEY (user_id, role_id) ); -- 角色权限关联表 CREATE TABLE role_permission ( role_id BIGINT NOT NULL, permission_id BIGINT NOT NULL, PRIMARY KEY (role_id, permission_id) );

这组表结构设计支持了用户、角色、权限之间的多对多关系,为灵活的权限管理提供了数据基础。

在控制器中使用Shiro注解进行权限控制

Shiro提供了一系列注解,可以在控制器方法上直接标注权限要求,实现细粒度的访问控制。以下是一些常用的注解示例:

@RestController @RequestMapping("/user") public class UserController { @RequiresAuthentication @GetMapping("/info") public Result getUserInfo() { // 获取当前登录用户信息 Subject subject = SecurityUtils.getSubject(); User user = (User) subject.getPrincipal(); return Result.success(user); } @RequiresRoles("admin") @GetMapping("/list") public Result getUserList() { // 只有admin角色可以访问 return Result.success(userService.findAll()); } @RequiresPermissions("user:delete") @DeleteMapping("/{id}") public Result deleteUser(@PathVariable Long id) { // 只有拥有user:delete权限的用户可以访问 userService.delete(id); return Result.success(); } }

通过这些注解,我们可以轻松实现:

  • @RequiresAuthentication:要求用户已认证
  • @RequiresRoles:要求用户拥有指定角色
  • @RequiresPermissions:要求用户拥有指定权限

这种基于注解的方式大大简化了权限控制代码,使开发者可以更专注于业务逻辑实现。

Shiro权限管理的最佳实践

1. 密码加密存储

在实际项目中,绝对不能明文存储用户密码。Shiro提供了多种加密算法,如MD5、SHA等。推荐使用带盐值的加密方式,提高密码安全性:

// 密码加密示例 String username = "admin"; String password = "123456"; String salt = RandomStringUtils.randomAlphanumeric(10); String encodedPassword = new SimpleHash("MD5", password, salt, 1024).toString(); // 存储 encodedPassword 和 salt 到数据库

2. 细粒度的权限设计

权限设计应遵循"最小权限原则",只给用户分配完成工作所必需的权限。推荐使用"资源:操作"的权限命名方式,如:

  • user:view - 查看用户
  • user:create - 创建用户
  • user:update - 更新用户
  • user:delete - 删除用户

3. 缓存权限信息

为提高系统性能,建议对用户的权限信息进行缓存。Shiro提供了缓存支持,可以通过配置启用:

@Bean public CacheManager cacheManager() { return new MemoryConstrainedCacheManager(); } // 在SecurityManager中设置缓存管理器 @Bean public SecurityManager securityManager(UserRealm userRealm, CacheManager cacheManager) { DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); securityManager.setRealm(userRealm); securityManager.setCacheManager(cacheManager); return securityManager; }

总结

通过本文的介绍,我们了解了如何在Spring Boot项目中集成Shiro实现权限管理。从依赖配置、核心组件设置、自定义Realm实现,到数据库设计和注解式权限控制,我们覆盖了Shiro集成的各个关键环节。

Shiro提供了一种简单而强大的方式来保护你的应用程序,无论是简单的身份验证还是复杂的基于角色的访问控制,都能轻松应对。希望本指南能帮助你更好地理解和应用Shiro,为你的项目构建坚实的安全防线。

要开始使用本项目中的Shiro示例,只需克隆仓库并进入demo-rbac-shiro模块:

git clone https://gitcode.com/gh_mirrors/sp/spring-boot-demo cd spring-boot-demo/demo-rbac-shiro

按照模块中的README.md说明进行配置和运行,即可快速体验Shiro在Spring Boot项目中的应用。

【免费下载链接】spring-boot-demo🚀一个用来深入学习并实战 Spring Boot 的项目。项目地址: https://gitcode.com/gh_mirrors/sp/spring-boot-demo

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/27 10:22:53

制剂车间欧姆龙PLC通过以太网模块与上位机及触摸屏建立通讯连接

一、行业背景与项目概况1.1 行业背景与核心需求随着人口老龄化加剧、慢性病发病率上升及健康意识提升&#xff0c;我国医药市场需求持续增长&#xff0c;2024年药品全国终端销售额达18638亿元。制药装备作为医药行业上游核心产业&#xff0c;正受益于行业发展与政策推动&#x…

作者头像 李华
网站建设 2026/4/27 10:21:21

KeymouseGo终极指南:如何用免费开源工具实现鼠标键盘自动化

KeymouseGo终极指南&#xff1a;如何用免费开源工具实现鼠标键盘自动化 【免费下载链接】KeymouseGo 类似按键精灵的鼠标键盘录制和自动化操作 模拟点击和键入 | automate mouse clicks and keyboard input 项目地址: https://gitcode.com/gh_mirrors/ke/KeymouseGo 你是…

作者头像 李华
网站建设 2026/4/27 10:21:09

泛乳酸化修饰抗体如何揭示免疫逃逸新机制?

一、乳酸化修饰是一种怎样的翻译后修饰&#xff1f;乳酸化修饰是近年来发现的一种以乳酸为底物的新型蛋白质翻译后修饰&#xff0c;主要发生于组蛋白赖氨酸残基上。该修饰由乳酸脱氢酶A&#xff08;LDHA&#xff09;催化生成&#xff0c;是细胞代谢异常特别是糖酵解增强的重要标…

作者头像 李华
网站建设 2026/4/27 10:17:21

如何永久备份微信聊天记录:WeChatExporter完整免费指南

如何永久备份微信聊天记录&#xff1a;WeChatExporter完整免费指南 【免费下载链接】WeChatExporter 一个可以快速导出、查看你的微信聊天记录的工具 项目地址: https://gitcode.com/gh_mirrors/wec/WeChatExporter 你是否曾因为手机丢失、系统升级或意外删除而丢失珍贵…

作者头像 李华
网站建设 2026/4/27 10:14:48

Python自动化大麦网抢票:混合架构实现毫秒级响应

Python自动化大麦网抢票&#xff1a;混合架构实现毫秒级响应 【免费下载链接】Automatic_ticket_purchase 大麦网抢票脚本 项目地址: https://gitcode.com/GitHub_Trending/au/Automatic_ticket_purchase 在热门演出票务抢购中&#xff0c;手动操作往往因网络延迟和反应…

作者头像 李华
网站建设 2026/4/27 10:13:07

DLSS Swapper:解锁游戏画质与性能的隐藏开关

DLSS Swapper&#xff1a;解锁游戏画质与性能的隐藏开关 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper 想象一下这样的场景&#xff1a;你正沉浸在最新大作的4K世界里&#xff0c;却发现远景模糊、纹理细节不足&#…

作者头像 李华