news 2026/4/2 18:42:44

使用 SpringBoot + AOP 实现简单的用户权限控制

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
使用 SpringBoot + AOP 实现简单的用户权限控制

前置安排:这里的权限控制使用的是五张 MySQL 表:分别为:

用户表、角色表、权限表、用户角色表(存储用户id和角色id的绑定关系)、角色权限表(存储角色id和权限id的绑定关系)

1、自定义注解,读取自定义的权限码

@Target(ElementType.METHOD) //表示该注解只能用于方法上 @Retention(RetentionPolicy.RUNTIME) //表示注解会在运行时保留 public @interface CheckPermission { String[] value(); // 定义需要的权限 }

切面类定义

@Aspect @Component public class PermissionAspect { private final PermissionService permissionService; //private final HttpServletRequest request; public PermissionAspect(PermissionService permissionService) { this.permissionService = permissionService; //this.request = request; } @Before("@annotation(checkPermission)") public void checkUserPermission(JoinPoint joinPoint, CheckPermission checkPermission) throws Exception { // 从请求头中获取用户ID //String userIdHeader = request.getHeader("User-Id"); // if (userIdHeader == null) { // throw new Exception("请求头中未找到 User-Id"); // } Long userId = Long.parseLong("1"); // 获取注解中所需的权限 String[] requiredPermissions = checkPermission.value(); // 校验用户是否具备指定权限 for (String permission : requiredPermissions) { System.out.println("permission = " + permission); if (!permissionService.hasPermission(userId, permission)) { throw new Exception("用户无权访问: " + permission); } } } }

注意:在 PermissionAspect 类中,去判断该用户是否拥有此权限。一般是根据用户的 id 传参,用户的id一般是在请求头中获取的,我这里为了方便,把用户的id写死为了 “1”。

@Service public class PermissionService { @Autowired private PermissionMapper permissionMapper; public boolean hasPermission(Long userId, String permissionName) { Set<String> userPermissions = permissionMapper.selectPermissionByUserId(userId); for (String permission : userPermissions) { if (permission.equals(permissionName)) { return true; } } return false; } }

2、根据用户的id关联查询权限码

@Mapper public interface PermissionMapper { Set<String> selectPermissionByUserId(@Param("userId") Long userId); }

XML语句

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.soft.mapper.PermissionMapper"> <select id="selectPermissionByUserId" resultType="java.lang.String" parameterType="map"> SELECT p.permission_name from users u left join user_role ur on u.id = ur.user_id left join roles r on ur.role_id = r.id left join role_permission rp on r.id = rp.role_id left join permissions p on rp.permission_id = p.id where u.id = #{userId} </select> </mapper>

3、在controller层使用权限校验

@RestController public class PermissopnController { //@CheckPermission({"100001", "100002"}) @CheckPermission("100001") @GetMapping("/hello") public String test1(){ return "hello world permission"; } }

注意:该权限码必须是该登录用户拥有的权限码,只有拥有权限码的用户才能访问该接口,如果是多个权限码,可以使用 {"权限码","权限码"} ,在这里多个权限码是并集。

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

自动化测试用例编写详解

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快自动化测试是使用专门的软件工具来验证软件解决方案&#xff0c;这通常涉及自动化功能作为测试过程的一部分。测试自动化最常见的对象是。1.测试管理和缺陷管理 2.单…

作者头像 李华
网站建设 2026/3/27 17:11:20

【Linux命令大全】009.备份压缩之cpio命令(实操篇)

【Linux命令大全】009.备份压缩之cpio命令&#xff08;实操篇&#xff09; ✨ 本文为Linux系统备份压缩命令的全面汇总与深度优化&#xff0c;结合图表、结构化排版与实用技巧&#xff0c;专为高级用户和系统管理员打造。 (关注不迷路哈&#xff01;&#xff01;&#xff01;) …

作者头像 李华
网站建设 2026/3/26 18:59:50

学霸同款9个降AI率工具 千笔帮你降AIGC

AI降重工具&#xff1a;让论文更“自然”的秘密武器 在当今学术写作中&#xff0c;AI生成内容的普及让越来越多的学生面临一个共同难题——如何降低AIGC率、去除AI痕迹&#xff0c;同时又不破坏文章的逻辑与语义。对于本科生而言&#xff0c;一篇论文的查重率不仅关系到能否顺利…

作者头像 李华
网站建设 2026/4/2 19:15:44

系统引导修复(免费)系统不能启动,一键修复系统引导

免费一键修复系统引导&#xff01;电脑开不了机&#xff1f;5分钟快速复活&#xff08;全系统适配&#xff09;电脑突然开不了机、黑屏提示“引导失败”&#xff0c;要么无限重启、卡在厂商Logo界面&#xff1f;相信很多人都遇到过这种崩溃场景&#xff0c;不用急着花钱找维修&…

作者头像 李华
网站建设 2026/4/1 21:04:37

【分布式系统】13 眺望未来:分布式系统前沿一瞥与 CRDTs 的乐观魔法

大家好&#xff0c;我是Tony Bai。 我们的远征即将抵达终点。在过去的十二讲中&#xff0c;我们从最基础的“系统模型”出发&#xff0c;掌握了“复制”与“分区”这两大生存法则&#xff0c;学习了“逻辑时钟”来重建因果&#xff0c;征服了“分布式事务”的重重险阻&#xff…

作者头像 李华
网站建设 2026/3/23 21:59:43

基于STM32的厨房安全报警系统

基于STM32的厨房安全报警系统 第一章 绪论 传统厨房安全防护多依赖人工巡查&#xff0c;存在燃气泄漏、火灾、干烧等风险发现滞后、预警手段单一的问题&#xff0c;极易引发安全事故&#xff0c;难以满足家庭及商用厨房的全天候安全管控需求。STM32单片机凭借高实时性、多接口扩…

作者头像 李华