soringcloud接口鉴权_springcloud项目实现自定义权限注解进行接口权限验证

一般在项目开发中会根据登录人员的权限大小对接口也会设置权限,那么对接口权限是怎么实现的呢,大多数都是用自定义权限注解,只需要在接口上加上一个注解就可以实现对接口的权限拦截,是否对该接口有权调用

接下来我们用一个简单的案例测试一下如何实现自定义权限注解

1、首先,创建一个类,命名随意,这里为MyPermission

packagecom.study.permission;import java.lang.annotation.*;

@Documented//作用域

@Inherited //可继承

@Target(ElementType.METHOD)//标明自定义注解可作用的地方,指方法

@Retention(RetentionPolicy.RUNTIME) //存活阶段,RUNRIME:存在运行期,还有jvm,class文件级别

public @interfaceMyPermission {

String username()default "name";//是否需要数据权限,默认为true

boolean required() default true;

}

在此解释一下,以上类中出现的注解

●@Target注解

Target注解的作用是:描述注解的使用范围

Target注解对象范围:注解可以用于修饰 packages、types(类、接口、枚举、注解类)、类成员(方法、构造方法、成员变量、枚举值)、方法参数和本地变量(如循环变量、catch参数),它的取值范围定义在ElementType 枚举中,详情可查源码

●@Retention注解

Reteniton注解的作用是:描述注解保留的时间范围(被描述的注解在它所修饰的类中可以被保留到何时)

Reteniton注解用来限定那些被它所注解的注解类在注解到其他类上以后,可被保留到何时,一共有三种策略(SOURCE,CLASS,RUNTIME),定义在RetentionPolicy枚举中

●@Documented注解

Documented注解的作用是:描述在使用 javadoc 工具为类生成帮助文档时是否要保留其注解信息,有兴趣的看官自己去研究研究

●@Inherited注解

Inherited注解的作用是:使被它修饰的注解具有继承性(如果某个类使用了被@Inherited修饰的注解,则其子类将自动具有该注解),有兴趣的看官自己去研究研究

2、创建一个类MyPermissionAspect并继承Ordered

packagecom.study.permission;importorg.aspectj.lang.ProceedingJoinPoint;importorg.aspectj.lang.annotation.Around;importorg.aspectj.lang.annotation.Aspect;importorg.aspectj.lang.annotation.Pointcut;importorg.aspectj.lang.reflect.MethodSignature;importorg.springframework.core.Ordered;importorg.springframework.stereotype.Component;importcom.alibaba.fastjson.JSONObject;importjava.lang.reflect.Method;

@Component

@Aspectpublic class MyPermissionAspect implementsOrdered {

@Pointcut("execution(* com.study.controller..*(..))")public voidpermissionTest() {

}

@Around("permissionTest()")public Object doPermission(ProceedingJoinPoint joinPoint) throwsThrowable {

MethodSignature signature=(MethodSignature)joinPoint.getSignature();

Method method=signature.getMethod();

MyPermission myPermission= method.getAnnotation(MyPermission.class);if(myPermission == null){returnjoinPoint.proceed();

}//判断是否需要数据权限

boolean required =myPermission.required();if (!required) {returnjoinPoint.proceed();

}

Object[] args=joinPoint.getArgs();if(null == args || args.length == 0){return "参数为空";

}

JSONObject json= JSONObject.parseObject(String.valueOf(args[0]));

String username=json.getString(myPermission.username());if(!"admin".equals(username)){return "权限验证未通过";

}returnjoinPoint.proceed();

}

@Overridepublic intgetOrder() {return 0;

}

}

3、测试demo,在controller层写测试方法

packagecom.study.controller;importcom.study.permission.MyPermission;importorg.springframework.beans.factory.annotation.Value;importorg.springframework.web.bind.annotation.RequestBody;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RequestParam;importorg.springframework.web.bind.annotation.RestController;

@RestControllerpublic classMainController {

@RequestMapping("test")

@MyPermissionpublicString permissionTest(@RequestBody String name){

System.out.println("已通过权限");return "success";

}

@RequestMapping("test02")publicString permissionTest02(@RequestBody String name){

System.out.println("未加权限");return "success";

}

}

在test方法上加权限注解@MyPermission,用postman测试后,传入参数name进行判断拦截,如果是admin则返回success,如果非admin,则显示权限验证未通过

加上注解,但传的参数为非admin时,显示不通过

测试方法二test02,不加权限注解时,接口应该返回success

写完了,大致内容就是这样紫了,但是一般情况下进行权限验证时候会携带token的,通过request获取token,然后根据token去查询判断当前用户的信息,再进行逻辑判断,这里全部省略了。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值