一、业务场景

  当前本人参与开发的是一个业务中台系统,所谓的中台简单的理解就是把相同的功能给抽取出来。比如系统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. 从嘉手札<2024-1-2>

    最近看了很多这样的文案,某音有,某扑也有很多,出于infp的被动,莫名的觉得悲伤. 悲伤的是一颗真心没有得到珍惜, 而更令我觉得悲伤的是, 人们往往会把自己炽烈如山海一样的情感倾泻给自己心仪的对象, ...

  2. 46从零开始用Rust编写nginx,数据还能这么传,多层代理(IP多级代理)搭建

    wmproxy wmproxy已用Rust实现http/https代理, socks5代理, 反向代理, 负载均衡, 静态文件服务器,websocket代理,四层TCP/UDP转发,内网穿透等,会将实 ...

  3. (转)时代的见证:集成更新的Windows 7旗舰版、专业版镜像

    制作缘起:微软曾于2019年提供过两份内部集成更新的英文旗舰版.专业版镜像(参见:集成IE11+最新补丁:微软新版Windows 7镜像泄露),方便用户安装,缩短更新过程.经我们下载安装研究发现,这两 ...

  4. React Hooks 使用指南

    .markdown-body { line-height: 1.75; font-weight: 400; font-size: 16px; overflow-x: hidden; color: rg ...

  5. Linux-使用cat查看文件后出现乱码,整个终端显示包括shell提示符都是乱码

    问题描述:在bash下用cat显示二进制文件后会出现乱码,整个终端显示包括shell提示符都是乱码,这个跟语言环境无关. 解决办法: 恢复的话,大致有以下几种方法:方法一:盲打输入echo -e '\ ...

  6. sshd命令-测试sshd_config配置是否正确

    sshd命令来自于英文词组"SSH daemon"的缩写,其功能是用于openssh服务器守护进程.openssh套件能够为两台主机之间建立加密的.可信任的数据通信服务,是rlog ...

  7. [Java]format string is malformed java

    format string is malformed java 最近在做代码审查,发现很多在使用 String.format 的时候遇到了IDEA报的 Format string 'xxx' is m ...

  8. [Java]Map接口有关总结

    Map接口 1.HashMap和Hashtable的区别 线程安全方面.HashMap是非线程安全的,Hashtable是线程安全的.因为Hashtable内部方法基本都经过synchronized修 ...

  9. 动态获取input内容文本(排除候选拼音文本) - js事件

    要想通过事件实时获取文本框文本,一开始是想到下面的方法,但实际效果都存在一定的缺点. 通过change/blur事件获取 change事件只有在选中点击或者失焦的时候,才能够触发. blur事件则是只 ...

  10. typescript 实现enum枚举值定义为对象

    壹 ❀ 引 最近因为有一些闲散时间,所以一直在做将Class组件重构为typescript + hooks组件的工作,结果今天就遇到一个有趣的问题.我们知道react Class组件一般都会定义Com ...