一、业务场景

  当前本人参与开发的是一个业务中台系统,所谓的中台简单的理解就是把相同的功能给抽取出来。比如系统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. 语义检索系统之排序模块:基于ERNIE-Gram的Pair-wise和基于RocketQA的CrossEncoder训练的单塔模型

    语义检索系统之排序模块:基于ERNIE-Gram的Pair-wise和基于RocketQA的CrossEncoder训练的单塔模型 文本匹配任务数据每一个样本通常由两个文本组成(query,title ...

  2. Flask 实现文件上传下载

    Flask 针对文件的上传下载相关代码片段,多种方法,包括限制文件格式,大小等. 实现图片文件上传 # name: 简单的实现文件上传任务. import os from flask import F ...

  3. vi / vim编辑器的使用 [补档-2023-07-01]

    vi/vim编辑器 ​ vi/vim编辑器是linux中的文本编辑器,其中vim比vi的功能更加强大,可以编辑shell程序,推荐使用vim,下面也将介绍vim如何使用. 2-1 vi/vim的三种工 ...

  4. Mac 下安装 mysqlclient

    brew install mysql export LDFLAGS="-L/usr/local/opt/openssl/lib" export CPPFLAGS="-I/ ...

  5. Xcode的Search Paths配置

    在Xcode中的文件搜索路径配置有两个地方,一个是Project层的配置,一个是Target的配置. Project-Build Settings-Search Paths Target-Build ...

  6. ElasticSearch7.3学习(十)----采用restful风格对索引的增删改查

    1. 为什么需要手动创建索引 直接put数据 PUT index/_doc/1,es会自动生成索引,并建立动态映射dynamic mapping.这样的话很大可能与实际的需求不服,在实际的应用上,我们 ...

  7. Java - CodeForces - 1230A

    题目: Dawid有了 4 包糖果.第 i 包里面有 Ai 个糖果. Dawid想把这四包糖果送给两个朋友,能否让两个朋友收到相同数量的糖果?注意,不能拆开任何一包糖,不能把糖果留给自己或扔掉,四包糖 ...

  8. MySQL-顺序IO和随机IO的区别

    顺序IO是指读写操作的访问地址连续.在顺序IO访问中,HDD所需的磁道搜索时间显着减少,因为读/写磁头可以以最⼩的移动访问下一个块.数据备份和日志记录等业务是顺序IO业务.随机IO是指读写操作时间连续 ...

  9. 反悔贪心&模拟费用流

    贪心是一种常用的算法,它能够获得局部最优解,但我们往往需要的是全局最优解,所以我们在贪心的时候加入和反悔的机制,让他能够得到全局最优解. 由于网络流中的退流操作本质上也是反悔贪心,所以在实现反悔贪心时 ...

  10. Javascript操作对象数组实现增删改查

    1.介绍 最近帮朋友弄一个简单的针对json数组的增删改成页面,正好涉及到了js去操作对象数组实现增删改查功能.我估计很多朋友应该也会遇到这类操作,所以记录一下以便分享. 2.数据准备 这里我就以学生 ...