使用简单的注解切面工程实现接口权限校验
需求背景:管理系统使用人员分管理员、业主、普通用户三类,需要在指定接口做权限校验,限制访问或仅可见本人数据。
首先自定义一个注解:
package com.hawk.smartoperation.common;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* @program: smartOperation
* @description: 权限校验切面注解
* @author: 作者名字
* @create: 2021-10-27 16:16
**/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyPermission {
/**
* 默认只有USER权限
* @return
*/
String[] value() default {
Constant.USER, Constant.ADMIN, Constant.OWNER};
}
其中类名上方的注解为元注解:jdk自带的注解,用来注解其他注解。
- @Target:
被描述的注解可以用在什么地方,如标识本注解可以使用在类上/方法上。取值(ElementType)有:
1.CONSTRUCTOR:用于描述构造
2.FIELD:用于描述域
3.LOCAL_VARIABLE:用于描述局部变量
4.METHOD:用于描述方法
5.PACKAGE:用于描述包
6.PARAMETER:用于描述参数
7.TYPE:用于描述类、接口(包括注解类型) 或enum声明
- @Retention
被描述的注解在什么范围内有效,如标识本注解在运行期间有效。取值(RetentionPoicy)有:
1.SOURCE:在源文件中有效(即源文件保留)
2.CLASS:在class文件中有效(即class保留)
3.RUNTIME:在运行时有效(即运行时保留)
-
@Documented
标记注解,表示注解可以被API文档化 -
@Inherited
标记注解,如果@Inherited修饰的注解用于一个class,则这个注解可被用于该class的子类。
@interface用来声明一个注解。格式:public @interface 注解名 {定义体}
**注解的属性值:**定义体里,方法的名称就是参数的名称,返回值类型就是参数的类型(返回值类型只能是基本类型、Class、String、enum)。可以通过default来声明参数的默认值。如 :
String value() default “”;
String[ ] value() default {};
我这里定义了接口的默认权限为数组形式,即实际使用时注解参数填入哪些权限标志就表示该接口允许何种权限。
接下来就是注解的内部业务逻辑了:通常都使用doBefore()、doAfter()、doAround()的模式,将判断写在doAround()中。
package com.hawk.smartoperation.common;
import com.hawk.smartoperation.common.commonmodel.CommonResultVO;
import com.hawk.smartoperation.model.PersonnelInfo;
import com.hawk.smartoperation.model.TicketInfoBO;
import com.hawk.smartoperation.service.PersonnelInfoService;
import com.hawk.smartoperation.utils.StringHandleUtils;
import lombok.extern.slf4j.