一、业务场景

  当前本人参与开发的是一个业务中台系统,所谓的中台简单的理解就是把相同的功能给抽取出来。比如系统A、B、C、D都需要进行用户登录操作,那么可以把用户信息管理这一块抽取出来为一个独立的系统E,这个系统只负责与用户相关的操作,比如登录、退出、授权,修改密码等等。然后让A/B/C/D这四个系统来调用系统E进行登录操作,这样A/B/C/D系统就不需要与用户登录相关的操作,可以专注于自己本身系统的业务处理。

自己所在的这个项目组也是在做类似的事情,将其他系统中的一些共有的功能给抽取出来,做成一个独立的系统供其他系统调用。我们做的系统当中也没有登录操作,用户权限控制这一块全部都是交给另外一个系统去完成,然后我们的系统需要和其他系统进行对接,来完成登录和权限相关的处理,比如某个用户可以查看哪些菜单,可以操作哪些功能等等。

二、需求分析

  首先登录操作都是在其他系统中完成的,登录完成后就开始在我们自己的系统中获取数据,最开始获取的就是与权限相关的数据,在之后的每一步操作中在去判断某个用户是否有操作某个功能的具体权限。初期打算这样设计,对于99%的业务操作都会将请求发送到Controller中,然后在判断是否有操作权限,有则放行,没有则返回。可是如何来实现这个功能呢?需要在每一个请求的接口中添加多个权限,某一个接口可能会被不同的地方调用。

三、解决方案

  首先考虑到的一点就是最好是使用注解,因为注解可以在多个地方被使用,并且注解可以添加各种参数来实现想要的功能。下一个需要考虑的问题是,添加注解后如何拿到这个注解当中的一些值或者说是数据,然后在进行最后的处理,而且这种方式是通用的。有几种方式是可以统一处理的,一个是过滤器,一个是拦截器,还有一个是AOP面向切面编程。考虑再三,最终选择使用AOP面向切面编程来进行处理。首先写好一个注解如下

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Documented
@Component
public @interface AuthResource {

    /*
     * 注解权限
     */
    String [] authResourceList() default {};
}

然后写一个AOP的处理类如下:

@Aspect
@Component
public class AuthResourceAspect {

@Pointcut("@annotation(test.controller.aop.AuthResource)")
private void execute() {}

@Before(value = "execute() && @annotation(authResource)")
public void temp(JoinPoint joinPoint, AuthResource authResource){
System.out.println("校验逻辑" + Arrays.toString(authResource.authResourceList()));
    }
}

Controller中的用法如下:

@Slf4j
@RestController
@RequestMapping("/test")
public class TestController {

@GetMapping("/1")
@AuthResource(authResourceList = "temp")
public String test() {
return "abc";
}
}

最后测试的结果如下:

正确的获取到访问某个方法时,注解里面的值。然后将该用户原有的权限列表和这个值进行比较,包含则表示有权限放行,

不包含则直接抛出异常信息,暂无权限访问。

参考博客.

https://blog.csdn.net/chali1314/article/details/115618777

AOP+自定义注解实现权限校验-2022新项目的更多相关文章

  1. springboot通过AOP和自定义注解实现权限校验

    自定义注解 PermissionCheck: package com.mgdd.sys.annotation; import java.lang.annotation.*; /** * @author ...

  2. AOP自定义注解鉴权

    刚出来工作那会或者在学校的时候,经常听到说AOP(面向对象编程,熟称切面)的用途是日志.鉴权等.但是那会不会,后面学会了,又没有写博客记录,今天写给大伙,希望能帮到大家 一.学习目标:利用AOP+自定 ...

  3. 使用AOP+自定义注解完成spring boot的接口权限校验

    记使用AOP+自定义注解完成接口的权限校验,代码如下: pom文件添加所需依赖: 1 <dependency> 2 <groupId>org.aspectj</group ...

  4. 利用Spring AOP自定义注解解决日志和签名校验

    转载:http://www.cnblogs.com/shipengzhi/articles/2716004.html 一.需解决的问题 部分API有签名参数(signature),Passport首先 ...

  5. (转)利用Spring AOP自定义注解解决日志和签名校验

    一.需解决的问题 部分API有签名参数(signature),Passport首先对签名进行校验,校验通过才会执行实现方法. 第一种实现方式(Origin):在需要签名校验的接口里写校验的代码,例如: ...

  6. ssm+redis整合(通过aop自定义注解方式)

    此方案借助aop自定义注解来创建redis缓存机制. 1.创建自定义注解类 package com.tp.soft.common.util; import java.lang.annotation.E ...

  7. spring AOP自定义注解方式实现日志管理

    今天继续实现AOP,到这里我个人认为是最灵活,可扩展的方式了,就拿日志管理来说,用Spring AOP 自定义注解形式实现日志管理.废话不多说,直接开始!!! 关于配置我还是的再说一遍. 在appli ...

  8. spring AOP自定义注解 实现日志管理

    今天继续实现AOP,到这里我个人认为是最灵活,可扩展的方式了,就拿日志管理来说,用Spring AOP 自定义注解形式实现日志管理.废话不多说,直接开始!!! 关于配置我还是的再说一遍. 在appli ...

  9. SpringBoot系列(十三)统一日志处理,logback+slf4j AOP+自定义注解,走起!

    往期精彩推荐 SpringBoot系列(一)idea新建Springboot项目 SpringBoot系列(二)入门知识 springBoot系列(三)配置文件详解 SpringBoot系列(四)we ...

  10. redis分布式锁-spring boot aop+自定义注解实现分布式锁

    接这这一篇redis分布式锁-java实现末尾,实现aop+自定义注解 实现分布式锁 1.为什么需要 声明式的分布式锁 编程式分布式锁每次实现都要单独实现,但业务量大功能复杂时,使用编程式分布式锁无疑 ...

随机推荐

  1. tensorflow语法【tf.gather_nd、reduce_sum、collections.deque 、numpy.random.seed()、tf.gradients()】

    相关文章: [一]tensorflow安装.常用python镜像源.tensorflow 深度学习强化学习教学 [二]tensorflow调试报错.tensorflow 深度学习强化学习教学 [三]t ...

  2. C/C++ 通过CRC32实现反破解

    我们可以通过使用CRC32算法计算出程序的CRC字节,并将其写入到PE文件的空缺位置,这样当程序再次运行时,来检测这个标志,是否与计算出来的标志一致,来决定是否运行程序,一旦程序被打补丁,其crc32 ...

  3. 【算法】priority_queue在力扣题中的应用 | 力扣692 | 力扣347 | 力扣295 【超详细的注释和算法解释】

    说在前面的话 博主也好长一段时间没有更新力扣的刷题系列了,今天给大家带来一些优先队列的经典题目,今天博主还是用C++给大家讲解,希望大家可以从中学到一些东西. 前言 那么这里博主先安利一下一些干货满满 ...

  4. 小知识:Linux如何删除大量小文件

    环境:RHEL 6.5 + Oracle 11.2.0.4 需求:使用df -i巡检发现Inodes使用率过高,需要清理删除文件来解决.如果Inodes满,该目录将不能写,即使df -h查看还有剩余空 ...

  5. MySQL-面试知识点汇总

    1. DQL相关 2. DDL.DML.DCL相关 3.架构相关 3.1 MySQL的复制原理以及流程 主从复制:将主数据库中的DDL和DML操作通过二进制日志(BINLOG)传输到从数据库上,然后将 ...

  6. UUID算法:独一无二的标识符解决方案

    引言 在分布式系统和大数据环境下,唯一标识符的生成和管理是一项关键任务.UUID(Universally Unique Identifier)算法应运而生,成为了解决重复数据和标识符冲突的有效工具.本 ...

  7. 多线程系列(二) -Thread类使用详解

    一.简介 在之前的文章中,我们简单的介绍了线程诞生的意义和基本概念,采用多线程的编程方式,能充分利用 CPU 资源,显著的提升程序的执行效率. 其中java.lang.Thread是 Java 实现多 ...

  8. NC19885 [AHOI2009]CHESS 中国象棋

    题目链接 题目 题目描述 在N行M列的棋盘上,放若干个炮可以是0个,使得没有任何一个炮可以攻击另一个炮. 请问有多少种放置方法,中国像棋中炮的行走方式大家应该很清楚吧.一个炮要能攻击另一个炮他们必须要 ...

  9. Ubuntu22.04 将EFI启动分区迁移到另一块硬盘

    机器上有两块硬盘, 一块已经安装了Win10, 另一块新装Ubuntu22.04, 在新硬盘上划分分区的时候, 有分出256M给 BOOT EFI, 但是安装的时候没注意, 启动分区不知道怎的跑到 W ...

  10. Sigrok逻辑分析仪软件(基于CY7C68013A)

    关于逻辑分析仪 逻辑分析仪在调试数字电路时是非常重要的工具. 其形式与示波器类似, 采集被检测信号的电平, 并绘制时序图进行分析. 逻辑分析仪和示波器的区别: 数字量和模拟量: 示波器采集的是模拟量, ...