首页 > 其他分享 >Springboot实现注解判断权限

Springboot实现注解判断权限

时间:2023-07-13 15:14:45浏览次数:34  
标签:Springboot value UserRoleEnum 注解 权限 方法 String

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,value,UserRoleEnum,注解,权限,方法,String
From: https://www.cnblogs.com/gen1us/p/17550500.html

相关文章

  • springboot整合kafka
    一、引入依赖(kafka的版本和springboot的版本对不上的话,启动会报错,包类不存在)<dependency><groupId>org.springframework.kafka</groupId><artifactId>spring-kafka</artifactId><version>2.5.1.RELEASE</version></de......
  • springboot - 整合flyway
    一、概念官网:https://flywaydb.org/数据库版本控制管理工具,通过集成Flyway可以实现启动项目时自动执行项目迭代升级。Flyway已经支持数据库包括:Oracle,SQLServer,SQLAzure,DB2,DB2z/OS,MySQL(includingAmazonRDS),MariaDB,GoogleCloudSQL,PostgreSQL(includ......
  • 管理员权限启动WPF应用程序
    1、添加应用程序清单文件 2、requestedExecutionLevel节点,level属性修改为“requireAdministrator”<requestedExecutionLevellevel="requireAdministrator"uiAccess="false"/> ......
  • 如何实现saas 权限架构设计的具体操作步骤
    SaaS权限架构设计概述在SaaS(SoftwareasaService)应用中,权限管理是一项非常重要的功能。它允许系统管理员对用户的访问和操作进行精细的控制,确保系统的安全性和数据的隔离性。本文将介绍实现SaaS权限架构设计的流程和每一步需要做的事情,以及相应的代码示例。流程图下面的表格......
  • @IdClass 注解和@Id JPA联合主键和注意事项
    @IdClass注解和@IdJPA联合主键原文链接:https://www.hxstrive.com/subject/open_jpa/538.htm前面章节已经介绍了@Id注解,该注解定义实体类中某个属性为数据库的主键,一个实体里面必须有一个主键。本章节将介绍@IdClass注解,该注解用来为某个实体指定复合主键,复合主键存放在......
  • 我开源了团队内部基于SpringBoot Web快速开发的API脚手架stater
    我们现在使用SpringBoot做Web开发已经比之前SprngMvc那一套强大很多了。但是用SpringBootWeb做API开发还是不够简洁有一些。每次WebAPI常用功能都需要重新写一遍。或者复制之前项目代码。于是我封装了这么一个抽出SpringBootWebAPI每个项目必备需要重复写的模块,和......
  • springboot下遇到的跨域问题
    后端跨域处理springboot项目注解@CrossOrigin实现WebMvcConfigurer接口中addCorsMappings(CorsRegistryregistry)方法配置CorsFilterfilter过滤器使用注意都可以单独使用,全部配置可能会导致不生效的问题addCorsMappings方法@Overridepublic......
  • springboot+vue前后端分离项目发布上线
    首先呢不用多说就是买阿里云服务器,但是呢,学生免费一个月。前端呢就是配置与后端端口 然后呢就是要打包:npmrunbuild把你的dist文件东西进行上传到服务器。后端springboot呢就是要打jar包上传。然后服务器是先去下载配置jdk,然后就是点击网站选择springboot项目最后一步呢......
  • SpringBoot中使用Netty开发WebSocket服务-netty-websocket-spring-boot-starter开源项
    场景SpringBoot+Vue整合WebSocket实现前后端消息推送:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/114392573SpringCloud(若依微服务版为例)集成WebSocket实现前后端的消息推送:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/114480731若依前后......
  • 通过自定义指令控制按钮权限
    目录常见写法自定义指令小试牛刀常见写法通常控制按钮显示与否,会采用v-if或者v-show来控制,可能会写成以下形式,在通过动态的改变active变量的值,控制按钮的显示状态,<template><div><buttonv-if="(active='1')">按钮一</button><buttonv-else-if="(active='......