Springboot实现注解判断权限

springboot,实现,注解,判断,权限 · 浏览次数 : 38

小编点评

## Spring Boot注解判断权限 以下是您提供代码的总结: **1. 权限注解 (@AuthCheck)** - 这是一个接口,用于标注方法是否需要授权。 - 注解带有 `@Target` 注解,表示该注解适用于方法级别。 - 注解带有 `@Retention` 注解,表示该注解在方法运行期间有效。 - 注解中包含 `mustRole` 属性,用于指定方法所需的权限。 **2. 权限枚举类 (UserRoleEnum)** - 定义了 3 个枚举值:`USER`, `ADMIN` 和 `BAN`。 - Each value 对应不同的权限。 - 使用 `getEnumByValue` 方法根据值获取枚举值。 **3. 权限拦截器 (AuthInterceptor)** - 该类是一个 AOP 中的切面。 - 它用于检查用户是否拥有指定的权限。 - 该拦截器首先获取当前用户的信息,然后检查其角色是否符合指定的权限要求。 - 如果用户没有权限,会抛出异常。 - 如果用户拥有ufficient权限,会通过权限校验继续执行方法。 **4. 使用注解的控制器方法** - 在 `addUser` 方法中,使用 `@AuthCheck` 注解标记方法的 `mustRole` 属性。 - 该属性要求只有管理员才能添加用户。 **代码示例:** ```java @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface AuthCheck { String mustRole(); } 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; } public static UserRoleEnum getEnumByValue(String value) { // ... } } @Aspect @Component public class AuthInterceptor { @Resource private UserService userService; @Override @Around("execution(* com.springboot.controller..(..))\") public Object doInterceptor(ProceedingJoinPoint joinPoint, AuthCheck authCheck) throws Throwable { // ... } } ``` **总结:** 使用 Spring Boot 注解可以简洁地判断用户是否拥有指定的权限,避免每个方法都要进行权限判断。

正文

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实现注解判断权限

今天记录一下使用springboot的注解来给方法加权限 避免了每个方法都需要大量的权限判断 超级方便√

如何实现 Java SpringBoot 自动验证入参数据的有效性

Java SpringBoot 通过javax.validation.constraints下的注解,实现入参数据自动验证 如果碰到 `@NotEmpty` 否则不生效,注意看下 `@RequestBody` 前面是否加上了`@Valid`

springboot使controller异步调用

调用controller方法,遇到操作时间很长的情况下,不希望前端一直等待操作,而希望前端立马接收到操作启动的反馈,而真正的操作在后端执行,需要用到异步调用的方法。实现步骤如下: 一、配置异步支持: 首先,在应用程序的主类上添加 @EnableAsync 注解,以启用异步支持 import org.

SpringBoot Windows 自启动 - 通过 Windows Service 服务实现

将.NetCore 做成 Windows 服务 - JAVA 同理 、将jar包安装为windows服务-bat启动方式 将 SpringBoot 注册为 Windows Service服务 可实现 SpringBoot 项目在Windows 中随系统自启动。也不用担心被识关闭

SpringBoot+mail 轻松实现各类邮件自动推送

一、简介 在实际的项目开发过程中,经常需要用到邮件通知功能。例如,通过邮箱注册,邮箱找回密码,邮箱推送报表等等,实际的应用场景非常的多。 早期的时候,为了能实现邮件的自动发送功能,通常会使用 JavaMail 相关的 api 来完成。后来 Spring 推出的 JavaMailSender 工具,进

我的第一个项目(十四) :完成数据保存功能(前端,增查改接口)

好家伙,天天拖,终于写完了 代码已开源(Gitee) PH-planewar: 个人开发的全栈小游戏 前端:vue2 + element-ui 后端: Springboot + mybatis-plus 数据库: mysql 目前实现功能: 1.注册登陆 2.游戏数据保存 3.游戏运行 (gitee

我的第一个项目(十五) :完成数据保存功能(后端,改update)

好家伙, 代码已开源(Gitee) PH-planewar: 个人开发的全栈小游戏 前端:vue2 + element-ui 后端: Springboot + mybatis-plus 数据库: mysql 目前实现功能: 1.注册登陆 2.游戏数据保存 3.游戏运行 (gitee.com) 后端这

SpringBoot整合XXLJob

目录XXLJob简介特性模块安装调度中心初始化数据库配置启动整合执行器pomymlXxlJobConfig启动执行器实践简单的定时任务在执行器创建任务在调度中心创建执行器在调度中心创建任务带前置和后置处理的定时任务XxlJob注解详解创建带前(后)置处理的任务父子任务父子执行器关联父子任务执行器侧l

Svelte框架实现表格协同文档

本文由葡萄城技术团队于博客园原创并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 首先,从框架搭建上,本篇示例采用当下流行的前后端分离的开发方式,前端使用npm作为脚手架搭建Svelte框架。 后端使用Java的SpringBoot作为后端框架。 首

[转帖]7 种提升 Spring Boot 吞吐量神技!

https://cloud.tencent.com/developer/article/2045348?areaSource=105001.6&traceId=7RuArY2Tm1MQWwQaMnx-Q 一、异步执行 实现方式二种: 1、 使用异步注解@aysnc、启动类:添加@EnableAsyn