news 2026/4/18 9:29:15

使用 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/4/18 8:41:50

【大家的项目】lele: Rust 把 ONNX 模型编译成机器码的 AI 框架

向大家介绍一个我正在开发的纯 Rust、零依赖、裸机级音频 AI 推理框架 —— lele。代码开源在 https://github.com/miuda-ai/lele 求Star反正我是受够了ORT(OnnxRuntime&#xff09;跨平台编译简直无语了&#xff0c;反正onnx也是静态的&#xff0c;干脆一步到底&#xff1a;le…

作者头像 李华
网站建设 2026/4/18 8:53:36

APP自动化测试:dom结构和元素定位方式

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快先来看几个名词和解释&#xff1a;dom: Document Object Model 文档对象模型dom应用: 最早应用于html和js的交互。界面的结构化描述&#xff0c; 常见的格式为html、…

作者头像 李华
网站建设 2026/4/18 5:27:50

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

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

作者头像 李华
网站建设 2026/4/18 11:04:09

期货与期权一体化平台结构设计最佳实践

场外期权结构设计是产业企业风险管理的核心技术环节。不同于标准化场内期权&#xff0c;场外期权的条款灵活度高&#xff0c;结构设计需兼顾风险控制、成本优化与业务适配。本文将分享期货与期权一体化平台中结构设计的最佳实践&#xff0c;帮助企业提升方案设计效率与质量。 …

作者头像 李华