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. ...
随机推荐
- JuiceFS 社区版 v1.1- Beta 发布,新增五个实用功能
我们很高兴地宣布 JuiceFS v1.1-Beta 版本正式发布啦!这是一个功能丰富的版本,带来了许多实用的新功能和改进.在这个版本中我们新增了以下功能: 目录配额:为目录设置配额限制,控制其大小和 ...
- 前端仿京东、天猫底部购物工具栏toolsBar、购物车栏、底部悬浮栏
快速实现 前端仿京东.天猫底部购物工具栏toolsBar.购物车栏.底部悬浮栏, 详情请访问uni-app插件市场地址:https://ext.dcloud.net.cn/plugin?id=1255 ...
- 3. Servlet原理
Servlet 是 Java Web 应用程序中的重要组件之一,它是一个 Java 类,用于处理客户端 HTTP 请求和生成 HTTP 响应.Servlet 的原理如下: 服务器启动时,Servlet ...
- Mybatis使用级联映射时 , 查询的结果为null
错误原因 在学习多对一映射处理中的级联方式处理映射关系时 , 发现自己查询的结果有一个为为null 于是就开始对代码进行排查 , debug ,最终发现错误 , 原来是自己映射中的 property ...
- ELK8.8部署安装并配置xpark认证
ELK8.8部署安装并配置xpark认证 介绍 主要记录下filebeat+logstash+elasticsearch+kibana抽取过滤存储展示应用日志文件的方式:版本基于8.8,并开启xp ...
- php处理emoji表情 存数据库
PHP 处理emoji表情 存数据库 直接过滤掉 1 function filter_emoji($str) { 2 $regex = '/(\\\u[ed][0-9a-f]{3})/i'; 3 $s ...
- SRS之StateThreads学习
最近在看SRS的源码.SRS是基于协程开发的,底层使用了StateThreads.所以为了充分的理解SRS源码,需要先学习一下StateThreads.这里对StateThreads的学习做了一些总结 ...
- PerfView专题 (第十三篇):洞察 .NET程序 的非托管句柄泄露
一:背景 1. 讲故事 前几天写了一篇 如何洞察 .NET程序 非托管句柄泄露 的文章,文中使用 WinDbg 的 !htrace 命令实现了句柄泄露的洞察,在文末我也说了,WinDbg 是以侵入式的 ...
- ElementUi使用el-tooltip实现超出部分显示省略号
效果前: 效果后: 创建myTooltio.vue组件 <template> <div class="tooltip-container"> <el- ...
- 2021-8-5 Mysql个人练习题
创建学校表格 CREATE TABLE `Student`( `s_id` VARCHAR(20), `s_name` VARCHAR(20) NOT NULL DEFAULT '', `s_birt ...