springboot security 权限校验_springboot借助aop和注解实现权限校验

我们用springboot做后台开发,难免会用到权限校验,比如查看当前用户是否合法,是否是管理员。而spring的面向切面的特效可以帮助我们很好的实现动态的权限校验。这里我们就用到的spring的aop。接下来就带领大家用aop和注解来快速的实现权限校验

一,在pom.xml里引入aop的类库。

<!--aop切面的使用-->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId>
</dependency>

二,自定义注解

package com.demo.permission;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/*** Created by qcl on 2019/2/18* desc:自定义权限管理注解*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Permission {String authorities() default "我是默认值";
}

三,借助@Aspect实现切面

package com.demo.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.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.ResponseBody;
import java.lang.reflect.Method;
import javax.security.auth.login.LoginException;
@Aspect
@Component
public class ControllerAspect {private final static Logger logger = LoggerFactory.getLogger(ControllerAspect.class);@Autowiredprivate UserService userService;/*** 定义切点*/@Pointcut("execution(public * com.demo.permission.controller.*.*(..))")public void privilege() {}/*** 权限环绕通知** @param joinPoint* @throws Throwable*/@ResponseBody@Around("privilege()")public Object isAccessMethod(ProceedingJoinPoint joinPoint) throws Throwable {//获取访问目标方法MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();Method targetMethod = methodSignature.getMethod();//得到方法的访问权限final String methodAccess = AnnotationParse.privilegeParse(targetMethod);//如果该方法上没有权限注解,直接调用目标方法if (StringUtils.isEmpty(methodAccess)) {return joinPoint.proceed();} else {//获取当前用户Object[] args = joinPoint.getArgs();if (args == null) {throw new LoginException("参数错误");}String currentUser = args[0].toString();logger.info("访问用户,{}", currentUser);if (!userService.isAdmin(currentUser)) {throw new LoginException("您不是管理员");} else {logger.info("您是管理员");//是管理员时,才返回所需要的信息return joinPoint.proceed();}}}
}

四,定义一个简单的管理员名单

package com.demo.permission;
import org.springframework.stereotype.Service;
import java.util.Arrays;
/*** Created by qcl on 2019/2/18* desc:*/
@Service
public class UserService {private String[] admins = {"qiushi", "weixin", "xiaoshitou"};//是否是管理员boolean isAdmin(String name) {return Arrays.asList(admins).contains(name);}
}

这里简单起见,就用一个本地的数组来维护管理员,正常应该是把管理员相关信息存到数据库里。

五,获取用户名,@Permission注解进行权限校验

package com.demo.permission.controller;
import com.demo.permission.Permission;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import lombok.extern.slf4j.Slf4j;
/*** Created by qcl on 2019/2/18* desc:*/
@RestController
@Slf4j
public class UserController {//带注解,需要校验权限@GetMapping(value = "/user")@Permissionpublic String user(@RequestParam String name) {return "你好:"+name+",您有管理权限";}//不带注解,不需要安全校验@GetMapping(value = "/user2")public String user2(@RequestParam String name) {return "不用检查权限,直接返回的数据";}
}

然后通过url请求来验证结果

1,http://localhost:8080/user?name=qcl2

dca8ae796ba1a0413880ad435fc49b3a.png

由于qcl2不在管理员数组里面,所以抛出异常

2,http://localhost:8080/user?name=qiushi

d704eb9abc63dcd53dbb5e70a9e5fd1b.png

qiushi是管理员,所以用户邱石可以访问到数据。

3,http://localhost:8080/user2?name=qiushi

f347caeef2078eb6d2713bd972cae5d3.png

由于接口/user2没有添加 @Permission注解,所以不用做安全校验,直接返回数据。

9f1fbb567130e0f97db94d8b39ba2960.png

到这里我们就轻松实现通过 @Permission一个注解,就可以实现数据的安全校验。

有任何关于编程的问题都可以私信我,我看到后会及时解答。

码农一枚,非著名全栈开发人员。分享自己的一些经验,学习心得,希望后来人少走弯路,少填坑

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/346630.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

electron sqlite3_electron集成sqlite3,win10上折腾了2天

要看解决办法的&#xff0c;直接把文章滚动到最后就行了&#xff0c;很简单。最近要做个 IM&#xff0c;PC 端选择用 electron&#xff0c;跨端的最佳选择了。桌面端项目&#xff0c;肯定少不了本地数据库&#xff0c;本来想用 sql.js&#xff0c;看了下需要手动拼接 SQL 语句&…

arrays中copyof复制两个数组_C语言100题集合026-使用指针交换两个数组中的最大值

系列文章《C语言经典100例》持续创作中&#xff0c;欢迎大家的关注和支持。喜欢的同学记得点赞、转发、收藏哦&#xff5e;后续C语言经典100例将会以pdf和代码的形式发放到公众号欢迎关注&#xff1a;计算广告生态 即时查收1 题目函数&#xff1a;max()、swap()功能&#xff1a…

红头文件rgb红色值_拿下抖音小姐姐,我写了个口红色号识别器

对于广大“钢铁直男”的程序员来说&#xff0c;送什么礼物给女朋友一直是个世纪难题。其实哄女朋友开心最深的套路就是花式送口红&#xff0c;就问谁抵挡得住啊啊啊啊......“没有什么问题是一支口红解决不了的&#xff0c;如果有&#xff0c;那就两支。”于是&#xff0c;直男…

腾讯offer是什么样子_月薪35K:2020腾讯Java后端开发详细面试流程

背景2017年我毕业于某不知名二本院校&#xff0c;校招进入一安防企业; 从事于后台服务接入工作。期间一直不断的提高自己&#xff0c;终于在今年如愿以偿&#xff0c;获得腾讯后台开发岗位offer。因此想借此分享成长路上的思考与困难&#xff0c;以及腾讯面试的整个流程。同时在…

javafx中的tree_JavaFX中的塔防

javafx中的tree我想长时间使用我的游戏引擎来编写《塔防》游戏&#xff0c;但是由于另一个小组努力创建JavaFX《塔防》游戏&#xff0c;所以我认为我宁愿创建另一款游戏。 从邮件列表中&#xff0c;我了解到不再开发其他游戏。 因此&#xff0c;我决定尝试一下。 塔防是一款非…

ubuntu linux theme,如何在Ubuntu 20.04中启用全局暗黑主题

Ubuntu 20.04在设置实用程序中引入了新的Dark暗模式。但是&#xff0c;当您在Gnome Shell中将其打开时&#xff0c;它并不是完全暗黑。系统任务栏菜单&#xff0c;顶部栏中的日历&#xff0c;通知弹出窗口和桌面上下文菜单不是暗的&#xff0c;而且当您在 Light&#xff0c;Dar…

python3语音识别模块_零基础教你玩转语音控制,学习语音控制技术,打造智能生活很简单...

大家好&#xff0c;我是阿乐&#xff0c;今天给大家讲解一下LD3320语音识别模块。先来看看模块实物&#xff0c;它是长这个样子的&#xff1a;LD3320语音识别模块实物我现在用来给大家做讲解的这个模块是已经集成了单片机在上面&#xff0c;这样子开发起来就更简单一些&#xf…

c语言程序设计常用语句格式,全国计算机考试二级C语言程序设计要求

(一)C语言的结构1、程序的构成&#xff0c;main函数和其他函数。2、头文件、数据说明、函数的开始和结束标志。3、源程序的书写格式。4、C语言的风格。(二)数据类型及其运算1、C的数据类型(基本类型、构造类型、指针类型、空类型)及其定义方法。2、C运算符的种类、运算优先级和…

多少秒算长镜头_自从搞烘焙后,遇到烘焙模具换算,秒变数学渣...

从小学到大学我们学习的计量单位简直太多了&#xff0c;秒、米 、千克、开尔文、安培、坎德拉、摩尔......什么长度、体积、面积都知道怎么算&#xff0c;想想上学的时候我还是很强大的。 自从搞烘焙后&#xff0c;遇到烘焙模具换算&#xff0c;秒变数学渣...教程食谱中的一小勺…

怎样实现登录用户管理_如何编写程序实现图书管理系统里面的用户管理功能

上节课完成了库存管理功能。这节课来完成用户管理功能。编写用户管理功能用户管理主要是针对数据库表user进行维护&#xff0c;功能包括查询、新增、编辑和删除。特别注意&#xff0c;删除用户时要确保该用户的不存在订单记录。防止在查询订单时找不到对应的用户信息&#xff0…

rest开发_REST 101开发人员专用

rest开发本地代码执行 诸如C之类的高级语言中的函数将被汇编为Assembly中的过程 。 它们增加了一个间接级别&#xff0c;使我们不必考虑内存地址。 诸如Java之类的面向对象语言中的方法和多态性增加了另一种间接性 &#xff0c;使我们不必考虑一组相似功能的特定变体。 尽管…

c语言 交互式电子白板案例,交互式电子白板教学案例

交互式电子白板教学案例交互式电子白板教学案例——电子白板让修改习作不再难钢城一小 熊莉红前言——转眼间&#xff0c;一年的时间稍瞬即逝。2012年的暑假&#xff0c;我们学校在每一个班级都安装了交互式电子白板&#xff0c;面对着这一新兴的产物&#xff0c;老师们跃跃欲试…

matlabrvctools主要功能及实际应用_【从业必备 | 收藏】ISO26262功能安全标准白皮书:关键组成、软硬件认证、测试过程、合规认证工具...

ISO26262功能安全标准白皮书&#xff1a;关键组成、软硬件认证、测试过程&#xff0c;合规的认证工具目 录背景ISO 26262的关键部分硬件组件认证软件组件认证“在实践中证明”的证据应用于现有流程测试工具认证下一步1. 背景随着各行业引进一系列产品设计和测试的标准化流…

JVM体系结构:JVM中的执行引擎

各位读者好&#xff01; 在JVM系列的上一篇文章中&#xff0c;开发人员了解了虚拟机的ClassLoader和Runtime Data Areas组件。 本教程将帮助开发人员正确理解JVM中的执行引擎 。 1.简介 在继续之前&#xff0c;让我们看一下Java虚拟机及其基本特征。 1.1什么是Java虚拟机&…

python编程语言优缺点_原创001 第一次接触这个神奇而又无所不能的编程语言:Python...

***********************人生苦短&#xff0c;我用Python&#xff0c;不定期更新博客&#xff0c;小伙伴们记得关注******************** OK&#xff0c;说到Python这个语言&#xff0c;相信大家。对它还是有一点小陌生&#xff0c;对于编程语言来说&#xff0c;我们大家耳熟能…

ese如何实现支付 nfc_海运费如何实现快捷支付?答案有了

快捷支付时代&#xff0c;海运费支付能否更简单&#xff1f;“航运在线通”给出了答案。1月9日&#xff0c;中国银行天津市分行举行了“航运在线通”产品发布会。天津市商务局、天津市金融局、天津市税务局、中国人民银行、国家外汇管理局天津市分局、中国银行总分行相关领导及…

smtplib 抄送邮件_用Python收发电子邮件

电子邮件是最古老的互联网服务之一&#xff0c;发明于1969年&#xff0c;它已经50岁了&#xff01;它并不要求收信人发信人同时连接网络&#xff0c;邮件存放于服务器&#xff0c;所以至今在企业内部还在大量使用。而且它是开放协议&#xff0c;没有被某大公司垄断。我们完全可…

console.log()不显示结果_RNA结合蛋白与RNA的缠绵故事,教你不做实验发文章

解螺旋公众号陪伴你科研的第1869天继续学习如何不做实验发文章RNA结合蛋白是(RNA binding protein&#xff0c;RBP)细胞中一类可以识别特殊的RNA结合域与RNA互作&#xff0c;并参与RNA剪切、转运、序列编辑、胞内定位及翻译控制等多种转录后的调控过程中。既然RBP功能这么重要&…

watch gt 鸿蒙,鸿蒙登陆第三站:第一枚Harmony手表亮相?华为Watch GT 2e首发

作者|蒋杰升简称|单蒋让你们荡起昨天(3月19日)中午&#xff0c;华为官方放出两款华为WatchGT 2全新配色&#xff1a;玫瑰金、冰雪白。而前一天则是被猜测新增石墨黑、火山红、薄荷绿三种配色。至此&#xff0c;华为WatchGT 2改款Watch GT 2e&#xff0c;定于3月26日发布已无悬念…

python设计模式有哪些_设计模式教程

设计模式是软件设计中常见问题的典型解决方案。它们就像能根据需求进行调整的预制蓝图&#xff0c;可用于解决代码中反复出现的设计问题。 设计模式与方法或库的使用方式不同&#xff0c;你很难直接在自己的程序中套用某个设计模式。模式并不是一段特定的代码&#xff0c;而是解…