SpringBoot自定义注解

SpringBoot自定义注解

需求场景

实现根据角色对菜单接口权限的控制

之前实现过几次类似功能,不过时间久了都忘记了,故这次实现的过程中,进行下记录。

创建注解类

1.首先创建注解

package com.lihl.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 权限注解,添加了该注解的方法,在开启权限配置的情况下,如果无权限访问,则不允许进入方法
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface HdPermissions {
    String value();
}

2.使用方法

	@PostMapping("test")
	@HdPermissions("bpm_design_query")
	public List<CategorizedProcessDefinition> categorizedPost(@RequestBody HashMap<String, Object> map) {
		//业务逻辑
		return 
	}

切面实现

@Before:前置通知:在方法执行前通知
@Around:环绕通知:可以将要执行的方法(point.proceed())进行包裹执行,可以在前后添加需要执行的操作
@AfterReturning: 后置通知:在方法正常执行完成进行通知,可以访问到方法的返回值的。
@AfterThrowing: 异常通知:在方法出现异常时进行通知,可以访问到异常对象,且可以指定在出现特定异常时在执行通知。
@After:方法执行后通知: 在目标方法执行后无论是否发生异常,执行通知,不能访问目标方法的执行的结果。

package com.lihl.annotation;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.util.List;


/**
 * @author: lihl
 * @date: 2023/9/26 16:35
 */
@Slf4j
@Aspect
@Component
public class PermissionsAspect {

    /**
     * 是否开启权限认证
     */
    @Value("${permissions.enable: true}")
    private Boolean isPermissions;

    //方法名随意,@annotation声明以注解的方式来定义切面,指定@annotation为刚刚自定义的注解
    @Pointcut("@annotation(com.lihl.annotation.Permissions)")
    public void permissions() {}

    // 使用@Around,需要先引入上面@Pointcut注解的方法名,在加上@annotation,
    // @annotation中的值,需要和action方法中的参数名称相同(必须相同,但是名称任意)
    //环绕通知
    @Around("permissions() && @annotation(permissions)")
    public Object action(ProceedingJoinPoint point, Permissions permissions) throws Throwable {
        if (isPermissions) {
            //是否包含该权限
            Boolean isContain = false;
            
            //判断用户是否包含该权限的业务逻辑
            
            //不包含则无权限
            if (!isContain) {
                throw new RuntimeException("暂无权限");
            }
        }
        Object result = point.proceed();
        log.info("响应结果为{}", result);
        //如果这里不返回result,则目标对象实际返回值会被置为null
        return result;
    }
}

效果:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值