news 2026/8/9 15:18:49

使用 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/8/4 6:51:44

黑词分析前端组件设计:双面板交互与黑词进度监控

前言 在内容安全、情报分析等领域&#xff0c;黑词&#xff08;敏感词汇&#xff09;分析是核心工作之一。本文深入解析一个企业级的黑词分析组件前端实现&#xff0c;该系统采用双面板交互设计、黑词进度监控和多维度分析&#xff0c;为安全分析人员提供高效、直观的操作界面…

作者头像 李华
网站建设 2026/7/31 9:09:19

一个SQL注入漏洞就能让整个网站大变样,从SQL注入到XSS攻击,完整还原黑客是如何篡改网站的_黑客攻击修改网站内容

在网络攻击事件中&#xff0c;SQL 注入与XSS 攻击是最常见的组合拳 —— 前者如同打开网站 “后门” 的钥匙&#xff0c;帮助黑客突破数据库与服务器权限&#xff1b;后者则像 “隐形画笔”&#xff0c;让黑客能随意篡改页面内容、劫持用户操作。本文将拆解这两种漏洞的技术原理…

作者头像 李华
网站建设 2026/8/4 1:02:09

软件测试详解(黑盒测试、白盒测试)

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 软件测试方法大类上分为黑盒测试、白盒测试和灰盒测试三种 一、黑盒测试 黑盒测试通俗来说即不知道代码是怎么写的。具体实现逻辑&#xff0c;基于代码输入有哪些…

作者头像 李华
网站建设 2026/7/31 9:09:31

收藏必看!大模型微调全攻略:9大PEFT方法详解,小白也能轻松掌握

大模型参数高效微调(PEFT)有九大主流方法&#xff0c;包括适配器、软提示等。这些方法主要在2021-2023年创立&#xff0c;后续多为小改进。工程应用推荐Adapter/LoRA&#xff0c;可在有限硬件上高效微调模型。 整体来看&#xff0c;主要分以下六大派系。 添加派(Additive) 添加…

作者头像 李华
网站建设 2026/8/7 19:29:27

<AI讲故事> 之《蝴蝶的一生》

故事通过小斑点从虫卵到蝴蝶的奇妙蜕变&#xff0c;展现了生命的循环与成长。 故事从康康和安安发现蝴蝶卵开始&#xff0c;讲述毛毛虫蜕皮、化蛹蜕变、最终展翅飞翔的全过程。孩子们在奶奶的引导下观察自然奥秘&#xff0c;见证了生命的奇迹。最后新一代虫卵的出现&#xff0c…

作者头像 李华