AOP 权限校验模块

自定义注解 检查权限

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
public @interface CheckPower {//请求路径参数String api() default "";//api相对地址String name() default "";//权限名称String remark() default "";//api描述
}

切面类 定义切点和增强方法

@Component
@Aspect
public class CheckPowerAspect {@Resourceprivate GetTokenUtil getTokenUtil;@Resourceprivate RedisService redisService;@Autowiredprivate ThreadService threadService;@Resourceprivate SkyPowerListMapper powerListMapper;/*** 定义切点*/@Pointcut("@annotation(com.example.sky_world.annotation.CheckPower)")private void pointcut() {}/*** 增强方法 进行权限判断* 1.超级管理员 直接放行* 2.遍历用户权限集合 存在权限则放行* 3.不存在权限 返回无权限信息* <p>* 判断有权限 放行前重置token的时效* l** @param jp* @param cp* @return*/@Around("pointcut() && @annotation(cp)")public Object advice(ProceedingJoinPoint jp, CheckPower cp) {//统一jp.proceed返回结果ResultVoUtils proceed = new ResultVoUtils();try {//api相对地址String requestApi = cp.api();//权限名称String name = cp.name();//api描述String remark = cp.remark();/*** 接口路径不存在于 sky_power_list表中时自动加入表中*///调用线程池执行新增操作threadService.insertPowerList(requestApi,name,remark);//获取请求方法入参 requestObject[] args = jp.getArgs();HttpServletRequest request = (HttpServletRequest) args[0];//获取tokenString token = getTokenUtil.getToken(request);//根据token从redis中获取用户信息SkyUserPower skyUserPower = (SkyUserPower) redisService.getObject(token);//redis中没有用户if (skyUserPower == null) {return new ResultVoUtils(ResponseCode.ERROR3.getCode(), "登陆超时,请重新登录");}/*** 超级管理员* 无视所有权限*/if (skyUserPower.getSuperadmin() != null) {redisService.setTimeOutToken(token, skyUserPower);//重置token时效proceed = (ResultVoUtils) jp.proceed();//放行return proceed;}/*** 游客(token为空)* 给默认权限*/if (token == null || "0".equals(token)) {redisService.setDbIndex(1);Map<String, String> GuestPowerMap = (Map<String, String>) redisService.getHash("group0");redisService.setDbIndex(0);for (String apiPath : GuestPowerMap.keySet()) {if (apiPath.equals(requestApi)) {//游客有权限proceed = (ResultVoUtils) jp.proceed();//放行return proceed;} else {//游客无权限return new ResultVoUtils(ResponseCode.ERROR3.getCode(), "没有权限!");}}}/*** 普通用户* 根据用户权限列表判断*///获取用户权限列表Map<String, String> powerMap = skyUserPower.getPowerMap();//遍历并判断是否有权限for (String apiPath : powerMap.keySet()) {if (apiPath.equals(requestApi)) {//请求路径存在于权限集合中redisService.setTimeOutToken(token, skyUserPower);//重置token时效proceed = (ResultVoUtils) jp.proceed();//放行return proceed;}}} catch (Throwable e) {e.printStackTrace();//如果接口有返回参数,返回该参数if (proceed.getCode() != 0) {return proceed;}return new ResultVoUtils(ResponseCode.ERROR3.getCode(), "获取权限异常,请重试!");}//以上判断均无结果 没有权限return new ResultVoUtils(ResponseCode.ERROR3.getCode(), "没有权限!");}
}

前端控制器

@CheckPower(api = "sky-article-list_queryArticle",name ="文章:根据id查询文章",remark = "根据id查询文章")@PostMapping("/queryArticle")public ResultVoUtils queryArticleByIds(HttpServletRequest request) throws IOException {//获取tokenString token = GetTokenUtil.getToken(request);byte[] bytes = StreamUtils.copyToByteArray(request.getInputStream());String s = new String(bytes, request.getCharacterEncoding());JSONObject jsonObject = JSONObject.fromObject(s);String ids = (String) jsonObject.get("ids");return skyArticleListService.selectSkyArticleList(ids,token);}

Redis

 /*** 设置用户登录权限列表hash* @param key* @param powerMap*/public void setTimeOutUserPowerMap(String key,Map powerMap){redisTemplate.opsForHash().putAll(key,powerMap);redisTemplate.expire(key,params.getTimetoken(),TimeUnit.HOURS);}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/1752.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

37、Tomato(VulnHub)

Tomato 一、nmap 2211是ssh的端口&#xff0c;21的ftp也不是弱密码 二、web渗透 随便看看 目录爆破 /seclists/Discovery/Web-Content/common.txt /antibot_image/antibots/readme.txt 发现该站点存在反爬机制 /antibot_image/antibots/info.php 提示我们该网页存在个参数 GET&…

Unity - 2D物理系统

Unity - 2D物理系统 PS&#xff1a; 通用属性放在每一章最前面&#xff0c;每个组件只介绍特殊属性&#xff1b; 1.1 2D刚体&#xff08;Rigidbody 2D&#xff09; 属性描述Body Type Dynamic&#xff08;动力学&#xff09;&#xff1a;适用于需要移动并且接受完全物理模拟的…

【Flutter】序列化方案之命令行生成model

目录 方案一、json_model 一行命令&#xff0c;将json文件转为Dart model类及.g.dart。安装使用 方案二、build_runner 手动写model类&#xff0c;命令行生成.g.dart序列化类安装使用 参考 方案一、json_model 一行命令&#xff0c;将json文件转为Dart model类及.g.dart。 安装…

SFP、SFP+、SFP28 与 QSFP28 收发器之间的差异:兼容性和性能

近年来&#xff0c;网络技术发展迅速&#xff0c;因此&#xff0c;计算专业人员面临着越来越令人困惑的术语和缩写词。 管理数据中心时必须了解的一个关键领域是收发器&#xff0c;特别是 SFP (1550nm/1310nm)、SFP (850nm) 和 QSFP28 (4x25G) 之间的差异。 这些型号在兼容性方…

深入浅出 SQL 优化:全面提升查询性能的技巧

文章目录 前言一、表结构分析1. 索引分析2. 数据类型分析3. 思考反范式设计的适用场景与潜在风险3.1数据冗余3.2 数据一致性3.3 更新性能 4. 关注临时表的创建与使用。4.1.尽量减少临时表的使用&#xff0c;以降低系统资源的消耗。4.2 使用合适的索引和数据类型优化临时表的性能…

HarmonyOS ArkUI实战开发-窗口模块(Window)

窗口模块用于在同一物理屏幕上&#xff0c;提供多个应用界面显示、交互的机制。 对应用开发者而言&#xff0c;窗口模块提供了界面显示和交互能力。对于终端用户而言&#xff0c;窗口模块提供了控制应用界面的方式。对于操作系统而言&#xff0c;窗口模块提供了不同应用界面的…

internet.getUserEncryptKey提示错误

大家好,相信你看到标题的时候,你应该是遇到这样的麻烦事情,微信小游戏的官方文档的说明不够全面,所以导致开发者在开发过程中会遇到非常棘手的问题,但无奈的是官方给与的只有冷冰冰的文字,包括很多开发者在开发者平台留言自己遇到的问题,比如常见的这个:internet.getUs…

swiper 去掉轮播图上的小点点 小圆圈(完美解决方案)

文章目录 问题描述解决方案问题复现处理方案 问题描述 大家好&#xff01;我是夏小花&#xff0c;今天是2024年4月22日|农历三月十四&#xff0c;今天这篇博文主要解决swiper 去掉轮播图上的小点点 小圆圈&#xff0c;具体解决方案如下所示 解决方案 问题复现 现在现在可以看…

命令模式:将请求封装为对象

在软件工程中&#xff0c;设计模式是解决常见问题的成熟模板。命令模式&#xff08;Command Pattern&#xff09;是这些设计模式之一&#xff0c;它属于行为型模式&#xff0c;用于将一个请求封装为一个对象&#xff0c;从而允许用户使用不同的请求、队列或日志请求来参数化其他…

数据结构初阶-二叉树

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 二叉树 树概念和结构 树的概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限节点组成的一个具有层次关系的集合&#xff0c;把它叫做树…

python--pyQt5 进度条:QProgressBar

https://www.cnblogs.com/itwangqiang/articles/14959401.html https://blog.csdn.net/weixin_43990846/article/details/123880081 进度条用于向用户指示操作的进度&#xff0c;并向他们保证应用程序仍在运行 例 1 import sys from PyQt5.QtWidgets import QApplication, QWi…

【机器学习】特征筛选:提升模型性能的关键步骤

一、引言 在机器学习领域&#xff0c;特征筛选是一个至关重要的预处理步骤。随着数据集的日益庞大和复杂&#xff0c;特征的数量往往也随之激增。然而&#xff0c;并非所有的特征都对模型的性能提升有所贡献&#xff0c;有些特征甚至可能是冗余的、噪声较大的或者与目标变量无关…

Webpack-

定义 静态模块&#xff1a;指的是编写代码过程中的html&#xff0c;css&#xff0c;js&#xff0c;图片等固定内容的文件 打包&#xff1a;把静态模块内容压缩、整合、翻译等&#xff08;前端工程化&#xff09; 1&#xff09;把less/sass转成css代码 2&#xff09;把ES6降级…

OpenHarmony鸿蒙南向开发案例:【智能加湿器】

样例简介 智能加湿器具有实时监控其所处环境温度、湿度&#xff0c;并通过数字管家设置日程&#xff0c;自动打开加湿器控制湿度功能。显示界面使用DevEco Studio 编写的js应用&#xff0c;具有很好的兼容和移植特性。硬件上采用了带有HDF框架的驱动模型&#xff0c;通过GPIO和…

nodejs在控制台打印艺术字

const figlet require("figlet");figlet("SUCCESS", function (err, data) {if (err) {console.log("Something went wrong...");console.dir(err);return;}console.log(data);}); 参考链接&#xff1a; https://www.npmjs.com/package/figlet…

JetBrains相关的IDE有哪些?

JetBrains是一家成立于2002年的捷克软件开发公司&#xff0c;总部位于捷克的布拉格&#xff0c;同时在俄罗斯的圣彼得堡及美国麻州波士顿等地设有办公室。该公司以其高质量的集成开发环境&#xff08;IDE&#xff09;产品而闻名&#xff0c;这些产品被广泛应用于各种编程语言和…

.net 报错 远程主机强迫关闭了一个现有的连接 问题分析解决

先测试cmd 发现可以ping通地址&#xff1a;证明不是网络问题 postman 报错 Error: Hostname/IP does not match certificates altnames 设置里ssl验证默认开启&#xff0c;把选项关闭&#xff0c;接着就正常了&#xff1a;证明应该是https或ssl 相关通讯出现问题 visual st…

Android studio配置Flutter(看这一篇就够了)

Flutter 是 Google 推出并开源的移动应用开发框架&#xff0c;主打跨平台、高保真、高性能。开发者可以通过 Dart 语言开发 App&#xff0c;一套代码同时运行在 iOS 和 Android平台。 Flutter 提供了丰富的组件、接口&#xff0c;开发者可以很快地为 Flutter 添加 Native&#…

牛批!大三就冲进腾讯了!最新大厂后端面经面试题

先来唠唠 最近有一些小伙伴都约到了腾讯的面试&#xff0c;今天分享一位成功上岸腾讯的大三同学的面经。 希望可以鼓励到你&#xff01; &#xff08;对了&#xff0c;文末有面经交流群&#xff09; 一面大概持续了45分钟&#xff0c;有35分钟都是在问Go基础相关的知识&…

20240420

docker 使用不添加sudo前缀 确认group&#xff1a; getent group如果没有docker组&#xff1a;sudo groupadd docker添加用户到docker组&#xff1a; sudo usermod -aG docker freja重启docker&#xff1a; sudo systemctl restart docker测试后依旧报错&#xff0c;如果是还是…