Springboot实现注解判断权限
Springboot实现注解判断权限
今天记录一下使用springboot的注解来给方法加权限
避免了每个方法都需要大量的权限判断 超级好用√
@
1.创建权限注解
首先我们先创建一个注解类
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AuthCheck {
/**
* 测试注解类
* mustRole : 方法使用需要的权限
* @return
*/
String mustRole() default "";
}
其中@Target(ElementType.METHOD)
注解表示该注解是使用在方法上的
@Retention(RetentionPolicy.RUNTIME)
定义了该注解的生命周期(我也是刚补完这块知识)
2.定义一个权限的枚举类
接下来我们创建一个角色权限的枚举类
public enum UserRoleEnum {
USER("用户", "user"),
ADMIN("管理员", "admin"),
BAN("被封号", "ban");
private final String text;
private final String value;
UserRoleEnum(String text, String value) {
this.text = text;
this.value = value;
}
/**
* 根据 value 获取枚举
*/
public static UserRoleEnum getEnumByValue(String value) {
if (ObjectUtils.isEmpty(value)) {
return null;
}
for (UserRoleEnum anEnum : UserRoleEnum.values()) {
if (anEnum.value.equals(value)) {
return anEnum;
}
}
return null;
}
public String getValue() {
return value;
}
public String getText() {
return text;
}
}
3.创建拦截器AOP校验权限
定义一个拦截器
@Aspect
@Component
public class AuthInterceptor {
@Resource
private UserService userService;
/**
* 执行拦截
*
* @param joinPoint
* @param authCheck
* @return
*/
@Around("@annotation(authCheck)")
public Object doInterceptor(ProceedingJoinPoint joinPoint, AuthCheck authCheck) throws Throwable {
String mustRole = authCheck.mustRole();
RequestAttributes requestAttributes = RequestContextHolder.currentRequestAttributes();
HttpServletRequest request = ((ServletRequestAttributes) requestAttributes).getRequest();
// 获取当前用户的信息
User loginUser = userService.getLoginUser(request);
// 必须有该权限才通过
if (StringUtils.isNotBlank(mustRole)) {
UserRoleEnum mustUserRoleEnum = UserRoleEnum.getEnumByValue(mustRole);
if (mustUserRoleEnum == null) {
throw new BusinessException(ErrorCode.NO_AUTH_ERROR);
}
String userRole = loginUser.getUserRole();
// 如果被封号,直接拒绝
if (UserRoleEnum.BAN.equals(mustUserRoleEnum)) {
throw new BusinessException(ErrorCode.NO_AUTH_ERROR);
}
// 必须有管理员权限
if (UserRoleEnum.ADMIN.equals(mustUserRoleEnum)) {
if (!mustRole.equals(userRole)) {
throw new BusinessException(ErrorCode.NO_AUTH_ERROR);
}
}
}
// 通过权限校验,放行
return joinPoint.proceed();
}
}
其中常见的AOP注解:
- @Aspect注解是把当前类标识为一个切面
- @Pointcut 植入Advice(通知)的触发条件。
poincut表达式介绍
拦截内容输入规范(pointcut表达式)
execute等
示例:@Around("execution(* com.springboot.controller..(..))")
- execution(): 表达式主体
- 第一个号:表示返回类型,号表示所有的类型
- 包名:表示需要拦截的包名,后面的两个句点表示当前包和当前包的所有子包,com.example.lx包、子孙包
- 第二个号:表示类名,号表示所有的类。
- (..):第三个号表示方法名,*号表示所有的方法,(..)表示方法参数,两个句点表示任何参数
五种增强注解
- @Before 前置增强,相当于BeforeAdvice,目标方法执行前执行
- @After final增强,不管是抛出异常或者正常退出都会执行
- @AfterReturning 后置增强,相当于AfterReturningAdvice,方法正常退出时执行
- @AfterThrowing 异常抛出增强,相当于ThrowsAdvice,目标方法抛出异常后执行
- @Around 环绕增强,相当于MethodInterceptor
注意:1、前四种增强修饰的方法可以通过声明JoinPoint 类型参数变量获取目标方法的信息(方法名、参数列表等信息);@Around修饰的方法必须声明ProceedingJoinPoint类型的参数,该变量可以决定是否执行目标方法,jp.proceed()表示执行目标方法
2、前四种增强修饰的方法没有返回值(即为void);而@Around修饰的方法必须有返回值,返回值为目标方法的返回值;
4.使用注解
最后在我们Controller层的方法上使用注解就可以进行权限的校验啦
@PostMapping("/add")
@AuthCheck(mustRole = UserConstant.ADMIN_ROLE)
public void addUser() {
//一大堆逻辑
}
上面就已经设置成只有管理员才能添加用户了
大功告成√
Springboot实现注解判断权限的更多相关文章
- SpringBoot aop 注解 数据权限校验
注解类: @Retention(RetentionPolicy.RUNTIME) public @interface DataAuthValid { //位置 public int index() d ...
- Attribute注解(用于判断权限)
一 Attribute原理: Attribute注解,是附加上方法.属性.类等上面的标签,可以通过方法的GetCustomAttribute获得粘贴的这个Attribute对象通过反射调用到粘贴到属 ...
- springboot使用jwt进行权限验证
springboot使用jwt进行权限验证 依赖准备 首先导入对应的依赖 <dependencies> <dependency> <groupId>org.apac ...
- SpringMVC学习系列(9) 之 实现注解式权限验证
对大部分系统来说都需要权限管理来决定不同用户可以看到哪些内容,那么如何在Spring MVC中实现权限验证呢?当然我们可以继续使用servlet中的过滤器Filter来实现.但借助于Spring MV ...
- SpringMVC实现注解式权限验证
SpringMVC学习系列(9) 之 实现注解式权限验证 对大部分系统来说都需要权限管理来决定不同用户可以看到哪些内容,那么如何在Spring MVC中实现权限验证呢?当然我们可以继续使用servle ...
- SpringMVC实现注解式权限验证(转)
SpringMVC学习系列(9) 之 实现注解式权限验证 对大部分系统来说都需要权限管理来决定不同用户可以看到哪些内容,那么如何在Spring MVC中实现权限验证呢?当然我们可以继续使用serv ...
- SpringBoot与Shiro整合权限管理实战
SpringBoot与Shiro整合权限管理实战 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] *观看本文章需要有一定SpringBoot整合经验* Shiro框架简介 Apach ...
- SpringMVC学习(9):实现注解式权限验证
对大部分系统来说都需要权限管理来决定不同用户可以看到哪些内容,那么如何在Spring MVC中实现权限验证呢?当然我们可以继续使用servlet中的过滤器Filter来实现.但借助于Spring MV ...
- Spring SpringMVC SpringBoot SpringCloud 注解整理大全
Spring SpringMVC SpringBoot SpringCloud 注解整理 才开的博客所以放了一篇以前整理的文档,如果有需要添加修改的地方欢迎指正,我会修改的φ(๑˃∀˂๑)♪ Spri ...
- 【实战】Springboot +jjwt+注解实现需登录才能操作
springboot +jjwt+注解实现需登录才能调用接口 1.开发需要登录才能进行操作的自定义注解NeedLogin,后面可以写在需要登陆后操作的接口上 package com.songzhen. ...
随机推荐
- Framework 中使用 Toolkit.Mvvm 的生成器功能
.NET Standard是.NET APIs的正式规范,可在多个.NET实现中使用..NET Standard的动机是为了在.NET生态系统中建立更大的统一性..NET 5及更高版本采用了不同的方法 ...
- Neo4J 图库的集群部署与基础使用
Ned4J 图库的集群部署与基础使用 部署机器 名称 配置 IP server1 8 核 16G 172.16.0.2 server2 8 核 16G 172.16.0.3 server3 8 核 1 ...
- 11. Mybatis的逆向工程
正向工程:先创建 Java 实体类,由框架负责根据实体类生成数据库表. Hibernate 是支持正向工 程的. 逆向工程:先创建数据库表,由框架负责根据数据库表,反向生成如下资源: Java 实体类 ...
- [ARM 汇编]高级部分—性能优化与调试—3.4.3 使用模拟器进行调试与测试
在ARM汇编程序开发过程中,使用模拟器(emulator)进行调试和测试是一种非常有效的方法.模拟器可以在不同的处理器上测试代码,帮助我们发现潜在的问题,并提供丰富的调试功能.本节将介绍如何使用QEM ...
- NetBeans连接SQLServer2008配置
一.配置SQL Server (一)SQL Server配置管理器 1.打开SQL Server配置管理器 (1)文件路径,我的是C:\Windows\SysWOW64\mmc.exe, 也可以从开始 ...
- vCenter报错:Vmware vAPI Endpoint
vCenter报错:Vmware vAPI Endpoint 问题现象: 平台警报1:设备管理运行状况警报 平台警报2:Vmware vAPI Endpoint服务运行状况警报 vcenter版本:v ...
- [MAUI]用纯C#代码写两个漂亮的时钟
@ 目录 时钟1 绘制锯齿表盘 绘制指针 绘制沿路径文本 时钟2 绘制表盘 绘制指针 项目地址 谷歌在2021年5月份推出的Android 12给我们带来了新的UI设计规范Material You,你 ...
- ZIM|一站式接入,打通 RTC 和 IM 组合拳
从用户信息.用户心跳到用户间私人与聊天室通信,IM 一直是互联网世界中不可或缺的基础建设之一.早在连麦和直播诞生之前,IM 就已是在通讯领域内服役多年的老兵,而随着线上音视频的兴起,IM 不仅没有没落 ...
- 【go语言】2.3.2 error 接口
在 Go 语言中,error 是一个内置的接口类型,用于表示错误情况.error 接口的定义如下: type error interface { Error() string } 任何具有 Error ...
- Unity UGUI的Outline(描边)组件的介绍及使用
Unity UGUI的Outline(描边)组件的介绍及使用 1. 什么是Outline(描边)组件? Outline(描边)组件是Unity UGUI中的一种特效组件,用于给UI元素添加描边效果.通 ...