SpringBoot使用AOP+注解实现简单的权限验证的方法
作者:wqh8522 发布时间:2022-07-29 00:59:09
标签:SpringBoot,aop,注解,权限验证
SpringAOP的介绍:传送门
demo介绍
主要通过自定义注解,使用SpringAOP的环绕通知拦截请求,判断该方法是否有自定义注解,然后判断该用户是否有该权限。这里做的比较简单,只有两个权限:一个普通用户、一个管理员。
项目搭建
这里是基于SpringBoot的,对于SpringBoot项目的搭建就不说了。在项目中添加AOP的依赖:<!--more--->
<!--AOP包-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
自定义注解及解析
在方法上添加该注解,说明该方法需要管理员权限才能访问。
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Permission {
String authorities() default "ADMIN";
}
解析类:通过AOP的环绕通知获取方法上的注解,判断是否有Permission注解,返回注解的值。
public class AnnotationParse {
/***
* 解析权限注解
* @return 返回注解的authorities值
* @throws Exception
*/
public static String privilegeParse(Method method) throws Exception {
//获取该方法
if(method.isAnnotationPresent(Permission.class)){
Permission annotation = method.getAnnotation(Permission.class);
return annotation.authorities();
}
return null;
}
}
SpringAOP环绕通知
@Aspect
@Component
public class ControllerAspect {
private final static Logger logger = LoggerFactory.getLogger(ControllerAspect.class);
@Autowired
private UserService userService;
/**
* 定义切点
*/
@Pointcut("execution(public * com.wqh.blog.controller.*.*(..))")
public void privilege(){}
/**
* 权限环绕通知
* @param joinPoint
* @throws Throwable
*/
@ResponseBody
@Around("privilege()")
public Object isAccessMethod(ProceedingJoinPoint joinPoint) throws Throwable {
//获取访问目标方法
MethodSignature methodSignature = (MethodSignature)joinPoint.getSignature();
Method targetMethod = methodSignature.getMethod();
//得到方法的访问权限
final String methodAccess = AnnotationParse.privilegeParse(targetMethod);
//如果该方法上没有权限注解,直接调用目标方法
if(StringUtils.isBlank(methodAccess)){
return joinPoint.proceed();
}else {
//获取当前用户的权限,这里是自定义的发那个发
User currentUser = userService.getCurrentUser();
logger.info("访问用户,{}",currentUser.toString());
if(currentUser == null){
throw new LoginException(ResultEnum.LOGIN_ERROR);
}
if(methodAccess.equals(currentUser.getRole().toString())){
return joinPoint.proceed();
}else {
throw new BusinessException(ResultEnum.ROLE_ERROR);
}
}
}
}
使用
只需要在需要验证的方法上添加自定义注解: @Permission既可
来源:https://segmentfault.com/a/1190000012845239


猜你喜欢
- 本项目为大家分享了Java实现简单计算器功能的具体代码,供大家参考,具体内容如下一 项目说明实训目的:掌握 Java GUI 开发中的布局管
- 关键点:将List内存储的对象实现Comparable类,重写它的compareTo()方法即可Bean:package chc;publi
- pom.xml与settings.xmlpom.xml与setting.xml,可以说是Maven中最重要的两个配置文件,决定了Maven的
- 一 前言在elasticsearch\config目录下,有三个核心的配置文件:elasticsearch.yml,es相关的配置。jvm.
- namespace ConsoleApplication1{ using System; &n
- 前言报表输出是Java应用开发中经常涉及的内容,而一般的报表往往缺乏通用性,不方便用户进行个性化编辑。Java程序由于其跨平台特性,不能直接
- 使用 transient 修饰private transient String noColumn;使用 static 修饰private s
- 一、问题分析及解决方案1、问题分析上一章我们讲过远程仓储统一管理配置信息,客户端可以通过统一配置服务中心 config server 服务端
- < application /> :应用的声明。 这个元素包含了子元素,这些子元素声明了应用的组件,元素的属性将会影响应用下的所
- for循环和foreach循环其实可以算得上是从属关系的,即foreach循环是可以转化成for循环,但是for循环不一定能转换成forea
- 有这么一种应用场景:你是做前端或APP开发的,需要调用服务端提供的接口,接口只能在公司内网访问;在公司外就无法调试代码了。想在公司外访问怎么
- 1. Handler使用引出现在作为客户,有这样一个需求,当打开Activity界面时,开始倒计时,倒计时结束后跳转新的界面(思维活跃的朋友
- 安卓中为activity创建菜单,供大家参考,具体内容如下1.在res上面右键 > new > Android xml file
- 本文实例为大家分享了Java实现简单ATM机功能的具体代码,供大家参考,具体内容如下项目介绍基于大家使用银行卡在ATM机取款操作,进行相对应
- 同步代码块基本语句synchronized (任意对象) {操作共享代码}代码示例public class SellTicket imple
- 404这个错误真的是一言难尽!不过大多是配置文件出错,认真修改还是可以的1.web.xml配置错误:默认首页没有写的,在web.xml添加一
- C#事件sender的小用法开WPF新坑了,看了WPF的炫酷界面,再看看winForm实在是有些惨不忍睹(逃)。后面会开始写一些短的学习笔记
- 绘制模糊数学中隶属函数分布图using System; using System.Collect
- 前言自从国产之光fastjson频频暴雷,jackson json的使用是越来越广泛了。尤其是spring家族把它搞成了默认的JSON处理包
- 本文介绍了java 读写Parquet格式的数据,分享给大家,具体如下:import java.io.BufferedReader;impo