发布时间:2026/7/28 16:41:06
使用Spring实现权限控制动态为注解赋值 首先这不是一个介绍或者使用SpringSecurity的博客。他是使用自定义注解和拦截器实现的权限管理(只供学习不可用于生产环境)技术栈:SpringBoot 2.1.6MySQL5.7大体思路:使用拦截器拦截请求在拦截器中使用 HandlerMethod 类获取当前请求方法上的自定义权限注解。判断是否有此访问权限。动态改变注解值实际生产环境中不同角色拥有的权限不可能一直不发生改变首先实现第一步创建两个注解Retention(RetentionPolicy.RUNTIME)Target(ElementType.TYPE)publicinterfaceMyClass{// 放置在类上}Retention(RetentionPolicy.RUNTIME)Target(ElementType.METHOD)publicinterfaceMyTest{String[]v()default{-1};// 防止在方法上// v() 中保存的是权限ID 默认-1 即没有任何角色可以访问}编写一个Controller并添加注解RestControllerRequestMapping(/myController)MyClasspublicclassMyController{RequestMapping(/get)MyTest(v{1,2,3})// 赋值上角色ID为 123才能访问publicStringget(){returnHello,world;}RequestMapping(/set)MyTestpublicStringset(){returnHello,world;}}编写拦截器不要忘记使用这个拦截器packagecom.annie.interceptor;importcom.alibaba.fastjson.JSON;importcom.annie.annotation.MyTest;importorg.springframework.stereotype.Component;importorg.springframework.web.method.HandlerMethod;importorg.springframework.web.servlet.HandlerInterceptor;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importjava.lang.reflect.Method;ComponentpublicclassMyInterceptorimplementsHandlerInterceptor{OverridepublicbooleanpreHandle(HttpServletRequest request,HttpServletResponse response,Object handler)throwsException{HandlerMethod handlerMethod(HandlerMethod)handler;Method methodhandlerMethod.getMethod();MyTest annotationmethod.getAnnotation(MyTest.class);if(annotation!null){// 从 request 或者 session 中获取当前请求角色String roleId1;// 假定请求角色的权限ID为1String[]vannotation.v();// 获取权限for(String s:v){if(s.equals(roleId)){// 判断是否拥有访问权限returntrue;}}returnfalse;}returnfalse;}}到此一个简单的权限判断就算是完成了但是我们不能预知一个方法可以使用的所有角色。所以我们要在使用一个方法让这个注解可以动态赋值。因为我们使用的是Spring框架Spring在项目启动初期就将所有的Bean收集起来了。我们这要拿到那个容器就可以拿到当前项目中所有方法。在通过去数据库类比。为每个自定义注解动态设置值。packagecom.annie.task;importcom.alibaba.fastjson.JSON;importcom.annie.annotation.MyClass;importcom.annie.annotation.MyTest;importorg.springframework.beans.BeansException;importorg.springframework.context.ApplicationContext;importorg.springframework.context.ApplicationContextAware;importorg.springframework.scheduling.annotation.Scheduled;importorg.springframework.stereotype.Component;importjava.lang.reflect.*;importjava.util.Map;ComponentpublicclassMyTaskimplementsApplicationContextAware{privateApplicationContext applicationContext;// 保存所有Bean的容器Scheduled(fixedRate1000)publicvoidtask01()throwsClassNotFoundException,NoSuchFieldException,IllegalAccessException{MapString,ObjectbeansWithAnnotationthis.applicationContext.getBeansWithAnnotation(MyClass.class);for(String key:beansWithAnnotation.keySet()){// 反射获取类这里有一个问题。我在使用 Swagger2 时添加了注解。用于Swagger2使用了动态代理我拿不到注解数据。// 于是这个我提供一个备用方案。 获取这个类的名称然后 通过 Class.forName() 获取注解值Object testControllerbeansWithAnnotation.get(key);Class?aClasstestController.getClass();Method[]methodsaClass.getDeclaredMethods();for(Method m:methods){MyTest annotationm.getAnnotation(MyTest.class);if(annotationnull){continue;}// 获取代理处理器InvocationHandler invocationHandlerProxy.getInvocationHandler(annotation);// 过去私有 memberValues 属性Field finvocationHandler.getClass().getDeclaredField(memberValues);f.setAccessible(true);// 获取实例的属性mapMapString,ObjectmemberValues(MapString,Object)f.get(invocationHandler);// 修改属性值String arr[]{1,2};memberValues.put(v,arr);System.out.println(JSON.toJSONString(annotation.v()));}}}OverridepublicvoidsetApplicationContext(ApplicationContext applicationContext)throwsBeansException{this.applicationContextapplicationContext;}}我这里懒得获取数据库中的值进行类比。直接写的死值。项目下载下载扩展内容github个人博客

相关新闻

2026/7/28 16:41:06

SpringBoot+Vue构建问卷调查系统的技术实践

1. 项目概述这个基于SpringBootVueMySQL的问卷调查系统是一个典型的毕业设计项目,它完整实现了问卷创建、发布、填写和统计分析的闭环流程。作为前后端分离架构的实践案例,它既包含了基础CRUD功能,又涉及了数据可视化、权限控制等进阶特性&am…

2026/7/28 16:41:06

PAT甲级 1060 Are They Equal 判断两个小数是否相等

Solution: 题目要求:给出两个非负的小数,且都不超过10的100次方。再给出一个有效位数,将这两个小数都转化为科学计数法的形式,即0.d[1]…d[N]*10^k (d[1]>0 除非这个数是0),若转化后的两数相等&#xff…

2026/7/28 16:36:06

环境变量的概念及设置的意义

首先,需要了解什么是环境变量? 环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数。在Windows和DOS操作系统中的path环境变量,当要求系统运行一个程序而没有告诉它程序所在的完…

2026/7/28 17:51:13

log4j:WARN No appenders could be found for logger 报错解决办法

问题描述: 项目启动失败,控制台打印错误提示信息: log4j:WARN No appenders could be found for logger (org.springframework.web.context.ContextLoader). log4j:WARN Please initialize the log4j system properly. log4j:WARN See http:/…

2026/7/28 17:51:13

终极Linux文件搜索革命:FSearch如何让文件查找快如闪电

终极Linux文件搜索革命:FSearch如何让文件查找快如闪电 【免费下载链接】fsearch A fast file search utility for Unix-like systems based on GTK3 项目地址: https://gitcode.com/gh_mirrors/fs/fsearch 你知道吗?在Linux系统中查找一个文件竟…

2026/7/28 17:51:13

combinations(组合数)

https://www.nowcoder.com/practice/4d0a110416d84c7f9454d0da53ab2da1?tpId46&tqId29101&tPage4&rp4&ru/ta/leetcode&qru/ta/leetcode/question-ranking 搜索回溯即可.不过注意为了防止重复出现,比如3 个数字选2个数字。避免出现1 3 和3 1 这种结果&…

2026/7/28 17:51:13

PHP:数组的排序函数:

数组的排序函数: 1.sort(); 不带key升序排序.** <?php $arrarray(0,1111,2,3,1114,5,611,7,8,5669,187780);sort($arr);echo <pre>; print_r($arr); echo </pre>;?>结果 是 Array ([0] > 0[1] > 2[2] > 3[3] > 5[4] > 7[5] > 8[6] >…

2026/7/28 17:51:13

HS2-HF Patch 技术架构与部署框架深度解析

HS2-HF Patch 技术架构与部署框架深度解析 【免费下载链接】HS2-HF_Patch Automatically translate, uncensor and update HoneySelect2! 项目地址: https://gitcode.com/gh_mirrors/hs/HS2-HF_Patch HS2-HF Patch 是基于 BepInEx 插件框架构建的综合性技术解决方案&…

2026/7/28 17:46:13

我用Python实现了一个小说网站雏形

前言 十个python九个爬&#xff0c;在大家的印象中好像Python只能做爬虫。然而并非如此&#xff0c;Python 也可以做Web开发&#xff0c;接下来给大家展示一下如何做一个小说站点。 相关软件 软件版本功能地址Python3.7.1脚本语言https://www.python.org/Django2.1.3Web框架…

2026/7/28 13:41:25

PDF合并与动态水印的工程化方案:2026国内免费工具实测对比

一、背景与测试方案 在实际项目交付中&#xff0c;PDF文件合并与版权保护水印的叠加是一个高频但容易被低估的技术需求。典型的处理链路涉及&#xff1a;多源PDF的文件流合并、页面级水印渲染&#xff08;含透明度混合与图层叠加&#xff09;、输出文件体积控制。看似简单的操作…

2026/7/28 0:03:34

学术论文研究创新点梳理与核心价值提炼指南

本科毕业论文是大学四年最大的坎。开题报告憋一周写不出三页&#xff0c;找文献翻遍十几个网站还是缺关键资料&#xff0c;写正文卡壳半天憋不出一句话&#xff0c;降重改到凌晨三点结果逻辑全乱&#xff0c;答辩前一天PPT还没做完。别慌&#xff0c;亲测这四个工具能让你少熬半…

2026/7/28 0:03:34

开发商售楼处数字化升级怎么做?

房企的数字化转型投入正在快速增长&#xff0c;据行业数据显示&#xff0c;2025年房企数字化投入规模已突破800亿元&#xff0c;年复合增长率达35%。售楼处的数字化升级不是单一环节的改造&#xff0c;而是从“获客-展示-成交-服务”全链路的系统升级。数字化升级四步法第一步&…

2026/7/28 0:03:34

模型不再值钱之后,AI 编程工具在争什么

2026 年 7 月&#xff0c;AI 编程工具赛道发生了一个标志性转折&#xff1a;模型本身不再值钱了。当 Kimi K3 开源模型在编程基准上击败 GPT 和 Claude&#xff0c;当 GitHub Copilot 第一次把开源模型纳入选择器&#xff0c;当 OpenAI 把 Codex 并入 ChatGPT 做成三合一超级应…

2026/7/28 4:38:09

3个高效策略:快速掌握Axure中文界面配置

3个高效策略&#xff1a;快速掌握Axure中文界面配置 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包。支持 Axure 11、10、9。不定期更新。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn 还在为Axure RP的英文界面感…