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

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

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

package com.study.permission;
import java.lang.annotation.*; @Documented //作用域
@Inherited //可继承
@Target(ElementType.METHOD)//标明自定义注解可作用的地方,指方法
@Retention(RetentionPolicy.RUNTIME) //存活阶段,RUNRIME:存在运行期,还有jvm,class文件级别
public @interface MyPermission {
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

package com.study.permission;

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.aspectj.lang.reflect.MethodSignature;
import org.springframework.core.Ordered;
import org.springframework.stereotype.Component;
import com.alibaba.fastjson.JSONObject; import java.lang.reflect.Method; @Component
@Aspect
public class MyPermissionAspect implements Ordered {
@Pointcut("execution(* com.study.controller..*(..))")
public void permissionTest() { }
@Around("permissionTest()")
public Object doPermission(ProceedingJoinPoint joinPoint) throws Throwable {
MethodSignature signature = (MethodSignature)joinPoint.getSignature();
Method method = signature.getMethod();
MyPermission myPermission = method.getAnnotation(MyPermission.class);
if(myPermission == null){
return joinPoint.proceed();
} //判断是否需要数据权限
boolean required = myPermission.required();
if (!required) {
return joinPoint.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 "权限验证未通过";
} return joinPoint.proceed();
} @Override
public int getOrder() {
return 0;
}
}

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

package com.study.controller;

import com.study.permission.MyPermission;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController; @RestController
public class MainController { @RequestMapping("test")
@MyPermission
public String permissionTest(@RequestBody String name){
System.out.println("已通过权限");
return "success";
}
@RequestMapping("test02")
public String permissionTest02(@RequestBody String name){
System.out.println("未加权限");
return "success";
}
}

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

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

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

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

springcloud项目实现自定义权限注解进行接口权限验证的更多相关文章

  1. Spring Cloud实战: 基于Spring Cloud Gateway + vue-element-admin 实现的RBAC权限管理系统,实现网关对RESTful接口方法权限和自定义Vue指令对按钮权限的细粒度控制

    一. 前言 信我的哈,明天过年. 这应该是农历年前的关于开源项目 的最后一篇文章了. 有来商城 是基于 Spring Cloud OAuth2 + Spring Cloud Gateway + JWT ...

  2. Spring Cloud实战 | 第十一篇:Spring Cloud Gateway 网关实现对RESTful接口权限控制和按钮权限控制

    一. 前言 hi,大家好,这应该是农历年前的关于开源项目 的最后一篇文章了. 有来商城 是基于 Spring Cloud OAuth2 + Spring Cloud Gateway + JWT实现的统 ...

  3. SpringBoot整合SpringSecurity示例实现前后分离权限注解

    SpringBoot 整合SpringSecurity示例实现前后分离权限注解+JWT登录认证 作者:Sans_ juejin.im/post/5da82f066fb9a04e2a73daec 一.说 ...

  4. JAVA里自定义注解来进行数据验证

    API开发中经常会遇到一些对请求数据进行验证的情况,这时候如果使用注解就有两个好处,一是验证逻辑和业务逻辑分离,代码清晰,二是验证逻辑可以轻松复用,只需要在要验证的地方加上注解就可以. Java提供了 ...

  5. Shiro 权限注解

      Shiro 权限注解:   Shiro 提供了相应的注解用于权限控制,如果使用这些注解就需要使用AOP 的功能来进行 判断,如Spring AOP:Shiro 提供了Spring AOP 集成用于 ...

  6. 2017.2.13 开涛shiro教程-第十二章-与Spring集成(二)shiro权限注解

    原博客地址:http://jinnianshilongnian.iteye.com/blog/2018398 根据下载的pdf学习. 第十二章-与Spring集成(二)shiro权限注解 shiro注 ...

  7. 使用AOP+自定义注解完成spring boot的接口权限校验

    记使用AOP+自定义注解完成接口的权限校验,代码如下: pom文件添加所需依赖: 1 <dependency> 2 <groupId>org.aspectj</group ...

  8. SpringCloud(8)---zuul权限校验、接口限流

    zuul权限校验.接口限流 一.权限校验搭建 正常项目开发时,权限校验可以考虑JWT和springSecurity结合进行权限校验,这个后期会总结,这里做个基于ZuulFilter过滤器进行一个简单的 ...

  9. JAVAEE——BOS物流项目11:在realm中授权、shiro的方法注解权限控制、shiro的标签权限控制、总结shiro的权限控制方式、权限管理

    1 学习计划 1.在realm中进行授权 2.使用shiro的方法注解方式权限控制 n 在spring文件中配置开启shiro注解支持 n 在Action方法上使用注解 3.★使用shiro的标签进行 ...

随机推荐

  1. Git教程 - 远程仓库

    到目前为止,我们已经掌握了如何在Git仓库里对一个文件进行时光穿梭,你再也不用担心文件备份或者丢失的问题了. 可是有用过集中式版本控制系统SVN的童鞋会站出来说,这些功能在SVN里早就有了,没看出Gi ...

  2. [LC] 12. Integer to Roman

    Roman numerals are represented by seven different symbols: I, V, X, L, C, D and M. Symbol Value I 1 ...

  3. MOOC(11)- 获取cookie后存到json中

    获取cookie后转成字典格式 把字典格式cookie存到json数据中 需要在表格中写好关键字,判断是否写cookie.是否读cookie 在需要用cookie的时候根据键去json中取值 # 1. ...

  4. python--包package、模块module、类Class、Mixin类(未完成)

    包package>模块module>类Class(包含了属性.方法.实例等概念) 模式一:一个包下面有多个py文件,即多个模块module 模式二:一个包下面包含多个子包packages ...

  5. 由情感计算带来的惊喜发现——记Rosalind W. PICARD“21世纪的计算”大会主题演讲

    W. PICARD"21世纪的计算"大会主题演讲" title="由情感计算带来的惊喜发现--记Rosalind W. PICARD"21世纪的计算& ...

  6. Freeswitch录音Dialplan

    <extension name="record"> <condition field="destination_number" express ...

  7. iOS数据锁

    简介 当一个线程访问数据时,而其他数据不能进行访问,保证线程安全或者可以理解为执行多线程,对于共享资源访问时保证互斥的要求 文章 不再安全的 OSSpinLock iOS开发中的11种锁以及性能对比 ...

  8. python 前端素材提供

    小图标素材:http://fontawesome.dashgame.com/

  9. MatterTrack Route Of Network Traffic :: Matter

    Python 1.1 基础 while语句 字符串边缘填充 列出文件夹中的指定文件类型 All Combinations For A List Of Objects Apply Operations ...

  10. Acwing 843. n-皇后问题

    n-皇后问题是指将 n 个皇后放在 n∗n 的国际象棋棋盘上,使得皇后不能相互攻击到,即任意两个皇后都不能处于同一行.同一列或同一斜线上. 现在给定整数n,请你输出所有的满足条件的棋子摆法. 输入格式 ...