热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

模仿shiro接口鉴权,自定义注解+springaop,实现用户访问接口权限校验

目录目的or背景码代码的工具人---isme1.自定义一个校验权限的注解2.码好咱们的切面3.搞个api4.postman测试4.1看书api4.2添加书api目的or背景shi

在这里插入图片描述


目录

  • 目的or背景
  • 码代码的工具人---is me
    • 1. 自定义一个校验权限的注解
    • 2. 码好咱们的切面
    • 3. 搞个api
    • 4. postman测试
      • 4.1 看书api
      • 4.2 添加书api


目的or背景

shiro有个注解是@RequiresPermissions,接口方法加上这个表示需要有指定权限才能访问,不然提示无权限访问等类似信息,这个吧,有点意思,没玩过,所以就来简单模仿下,自己自定义一个注解,具备指定权限才可调通。


码代码的工具人—is me

接下来就是demo实现


1. 自定义一个校验权限的注解

package com.example.demo.anno;import java.lang.annotation.*;/**** @author apollo* @description* @date 2021/11/27 10:01*/
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface VerifyPermissions {/*** 权限标识*/String[] value();}

2. 码好咱们的切面

在这里面我先写死用户有【book_read】的权限,你们可根据自己的业务查数据库or缓存,自由发挥,只是个demo,别太较真

package com.example.demo.aspect;import com.example.demo.anno.VerifyPermissions;
import com.example.demo.exception.BaseException;
import com.example.demo.exception.Code;
import com.example.demo.exception.Message;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Arrays;
import java.util.List;/*** @author apollo* @description* @date 2021/11/27 10:11*/
@Aspect
@Component
@Slf4j
public class AuthAspect {&#64;Before("execution(public * com.example.demo.controller..*.*(..))")public void apiDoBefore(JoinPoint point) {verifyProceed(point);}private void verifyProceed(JoinPoint point) {MethodSignature signature &#61; (MethodSignature) point.getSignature();Method method &#61; signature.getMethod();int modifiers &#61; method.getModifiers();if (!Modifier.isPublic(modifiers)) {return;}//初始化用户有的权限值&#xff08;为了演示方便&#xff0c;这个地方一般不是写死的权限&#xff0c;根据自己业务来灵活加载&#xff09;final List<String> userBindingPermissions &#61; Arrays.asList("book_read");//校验api的权限值VerifyPermissions verifyPermissions &#61; method.getAnnotation(VerifyPermissions.class);if (verifyPermissions !&#61; null) {//拿到添加注解的api所需要的权限String[] verifyPermissionsStrs &#61; verifyPermissions.value();List<String> needPermisions &#61; Arrays.asList(verifyPermissionsStrs);//1.判断用户有权限if (CollectionUtils.isEmpty(userBindingPermissions)) {log.info("用户无权限&#xff0c;不可操作&#xff01;", needPermisions);throw new BaseException(Code.UNAUTHORIZED, Message.AUTH_FAILED);}//2.判断用户有的权限是否匹配注解api中的权限if (!userBindingPermissions.containsAll(needPermisions)) {log.info("用户缺少:{}权限&#xff01;", needPermisions);throw new BaseException(Code.UNAUTHORIZED, Message.AUTH_FAILED);}}}}

3. 搞个api

我先初始化几个书名&#xff0c;然后来两个api&#xff0c;加上访问接口需要校验的权限【book_read】、【book_add】

package com.example.demo.controller;import com.example.demo.anno.VerifyPermissions;
import org.springframework.web.bind.annotation.*;import java.util.LinkedList;
import java.util.List;/*** &#64;author apollo* &#64;description* &#64;date 2021年11月27日 10:27*/
&#64;RestController
&#64;RequestMapping("/book")
public class BookApi {private static final List<String> bookNames &#61; new LinkedList<>();static {bookNames.add("霸道总裁爱上我");bookNames.add("霸道总裁的小娇妻");}&#64;GetMapping("/all")&#64;VerifyPermissions({"book_read"})public List<String> books(){return bookNames;}&#64;PostMapping("/add")&#64;VerifyPermissions({"book_add"})public Boolean books(&#64;RequestParam("name")String name){bookNames.add(name);return true;}
}

4. postman测试


4.1 看书api

因为我在切面那边给用户初始化了一个可以看书的权限【book_read】&#xff0c;所以是可以调通
在这里插入图片描述


4.2 添加书api

没有给用户绑定【book_add】的权限&#xff0c;所以用户在使用这个api的时候&#xff0c;提示无权限
在这里插入图片描述
如果在切面那里给他加上【book_add】权限&#xff0c;就可以了
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

这只是模仿shiro api鉴权的一个小demo&#xff0c;shiro里面&#64;RequiresPermissions注解中还有Logical属性【AND,OR】&#xff0c;来校验权限之间的逻辑关系&#xff0c;有兴趣的话可以看下shiro下PermissionAnnotationHandler的源码&#xff0c;自己去自定义个鉴权注解~

就先说到这\color{#008B8B}{ 就先说到这}
在下Apollo\color{#008B8B}{在下Apollo}Apollo
一个爱分享Java、生活的小人物&#xff0c;\color{#008B8B}{一个爱分享Java、生活的小人物&#xff0c;}Java&#xff0c;
咱们来日方长&#xff0c;有缘江湖再见&#xff0c;告辞&#xff01;\color{#008B8B}{咱们来日方长&#xff0c;有缘江湖再见&#xff0c;告辞&#xff01;}&#xff0c;&#xff0c;&#xff01;

在这里插入图片描述


推荐阅读
  • 使用nodejs爬取b站番剧数据,计算最佳追番推荐
    本文介绍了如何使用nodejs爬取b站番剧数据,并通过计算得出最佳追番推荐。通过调用相关接口获取番剧数据和评分数据,以及使用相应的算法进行计算。该方法可以帮助用户找到适合自己的番剧进行观看。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • r2dbc配置多数据源
    R2dbc配置多数据源问题根据官网配置r2dbc连接mysql多数据源所遇到的问题pom配置可以参考官网,不过我这样配置会报错我并没有这样配置将以下内容添加到pom.xml文件d ... [详细]
  • web.py开发web 第八章 Formalchemy 服务端验证方法
    本文介绍了在web.py开发中使用Formalchemy进行服务端表单数据验证的方法。以User表单为例,详细说明了对各字段的验证要求,包括必填、长度限制、唯一性等。同时介绍了如何自定义验证方法来实现验证唯一性和两个密码是否相等的功能。该文提供了相关代码示例。 ... [详细]
  • 分享css中提升优先级属性!important的用法总结
    web前端|css教程css!importantweb前端-css教程本文分享css中提升优先级属性!important的用法总结微信门店展示源码,vscode如何管理站点,ubu ... [详细]
  • Android自定义控件绘图篇之Paint函数大汇总
    本文介绍了Android自定义控件绘图篇中的Paint函数大汇总,包括重置画笔、设置颜色、设置透明度、设置样式、设置宽度、设置抗锯齿等功能。通过学习这些函数,可以更好地掌握Paint的用法。 ... [详细]
  • 本文介绍了OkHttp3的基本使用和特性,包括支持HTTP/2、连接池、GZIP压缩、缓存等功能。同时还提到了OkHttp3的适用平台和源码阅读计划。文章还介绍了OkHttp3的请求/响应API的设计和使用方式,包括阻塞式的同步请求和带回调的异步请求。 ... [详细]
  • 本文介绍了使用Spark实现低配版高斯朴素贝叶斯模型的原因和原理。随着数据量的增大,单机上运行高斯朴素贝叶斯模型会变得很慢,因此考虑使用Spark来加速运行。然而,Spark的MLlib并没有实现高斯朴素贝叶斯模型,因此需要自己动手实现。文章还介绍了朴素贝叶斯的原理和公式,并对具有多个特征和类别的模型进行了讨论。最后,作者总结了实现低配版高斯朴素贝叶斯模型的步骤。 ... [详细]
  • Activiti7流程定义开发笔记
    本文介绍了Activiti7流程定义的开发笔记,包括流程定义的概念、使用activiti-explorer和activiti-eclipse-designer进行建模的方式,以及生成流程图的方法。还介绍了流程定义部署的概念和步骤,包括将bpmn和png文件添加部署到activiti数据库中的方法,以及使用ZIP包进行部署的方式。同时还提到了activiti.cfg.xml文件的作用。 ... [详细]
  • 深入理解Java虚拟机的并发编程与性能优化
    本文主要介绍了Java内存模型与线程的相关概念,探讨了并发编程在服务端应用中的重要性。同时,介绍了Java语言和虚拟机提供的工具,帮助开发人员处理并发方面的问题,提高程序的并发能力和性能优化。文章指出,充分利用计算机处理器的能力和协调线程之间的并发操作是提高服务端程序性能的关键。 ... [详细]
  • 使用Spring AOP实现切面编程的步骤和注意事项
    本文介绍了使用Spring AOP实现切面编程的步骤和注意事项。首先解释了@EnableAspectJAutoProxy、@Aspect、@Pointcut等注解的作用,并介绍了实现AOP功能的方法。然后详细介绍了创建切面、编写测试代码的过程,并展示了测试结果。接着讲解了关于环绕通知的使用方法,并修改了FirstTangent类以添加环绕通知方法。最后介绍了利用AOP拦截注解的方法,只需修改全局切入点即可实现。使用Spring AOP进行切面编程可以方便地实现对代码的增强和拦截。 ... [详细]
  • Python教学练习二Python1-12练习二一、判断季节用户输入月份,判断这个月是哪个季节?3,4,5月----春 ... [详细]
  • 本文介绍了Redis中RDB文件和AOF文件的保存和还原机制。RDB文件用于保存和还原Redis服务器所有数据库中的键值对数据,SAVE命令和BGSAVE命令分别用于阻塞服务器和由子进程执行保存操作。同时执行SAVE命令和BGSAVE命令,以及同时执行两个BGSAVE命令都会产生竞争条件。服务器会保存所有用save选项设置的保存条件,当满足任意一个保存条件时,服务器会自动执行BGSAVE命令。此外,还介绍了RDB文件和AOF文件在操作方面的冲突以及同时执行大量磁盘写入操作的不良影响。 ... [详细]
author-avatar
lzmhezy198344
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有