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,一经查实,立即删除!

相关文章

linux 应用网络连接失败的原因,PuTTY网络错误:软件导致连接中止

解决PuTTY网络错误Software caused connection abort阅读有关该错误的PuTTY怎么说这是Windows网络代码由于某种原因而终止已建立的连接时所产生的一般错误。例如&#xff0c;如果将网络电缆从连接以太网的计算机背面拔出&#xff0c;或者Windows出于其他类似原因认为整个网络都…

javaone_替代JavaOne 2013

javaone我对无法参加JavaOne 2013感到很失望&#xff0c;但是很高兴看到涵盖这个年度会议的大量有用帖子。 在这篇文章中&#xff0c;我链接到许多此类资源&#xff0c;并提供了每篇文章相对于JavaOne 2013讨论内容的简短摘要。 主题演讲 主题演讲是“大公告”趋向于发生的地方…

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

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

linux下客户端与ntp同步时间,如何在Windows客户端和Linux NTP服务器之间同步时间?...

我希望我的Windows 7机器能够从我的Linux Debian Sid服务器中获取时间.所以我想提前并从Debian存储库安装OpenNTPD.默认情况下它不会监听任何内容,因此我将其配置如下&#xff1a;listen on 192.168.0.1server 0.debian.pool.ntp.orgserver 1.debian.pool.ntp.orgserver 2.debi…

Java的最新发展– 2018年4月下旬

本周Java领域有一些最新的发展&#xff0c;我在本文中总结了其中的一些。 我们知道的JavaOne的终结 Stephen Chin在帖子“ JavaOne活动扩展了更多的曲目&#xff0c;语言和社区以及新名称 ”中说&#xff0c;“ JavaOne会议正在扩展以创建一个新的更大的活动&#xff0c;该活动…

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

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

linux 嵌入式串口通信设计目的,基于linux的嵌入式串口通信.doc

PAGE天津电子信息职业技术学院《嵌入式软件编程》课程报告课程名称&#xff1a;基于linux的嵌入式串口通信课程代码&#xff1a; 115229姓 名&#xff1a; 甘琦学 号&#xff1a; 48专 业&#xff1a; 物联网应用技术班 级&#xff1a; 物联S14-1完成时间&#xff1a;2016 年 1…

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

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

zabbix监控suse linux,SuSE 系统之部署 Zabbix 监控服务

SuSE 系统之部署 Zabbix 监控服务2.4 安装 Apache2 httpd-2.4.2.tar.gz#tar?-zvxf?httpd-2.4.2.tar.gz??#./configure?--prefix/usr/local/services/apache2?--with-apr/usr/local/services/apr/?--with-apr-util/usr/local/services/apr-util/?--with-pcre/usr/local/…

java反射教程_Java反射教程

java反射教程在本教程中&#xff0c;我主要编写一些示例来介绍Java反射可以做什么。 希望它可以给您这个概念的概述。 请留下您的评论以寻求建议。 什么是反射&#xff1f; 简而言之&#xff0c;反射是程序在运行时检查和修改对象的结构和行为的能力。 这个概念有时与内省混合…

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

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

Spring Cloud简介–配置(第一部分)

1.概述 Spring Cloud为开发人员提供了工具&#xff0c;以快速构建分布式系统中的某些常见模式&#xff08;例如&#xff0c;配置管理&#xff0c;服务发现&#xff0c;断路器&#xff0c;智能路由&#xff0c;微代理&#xff0c;控制总线&#xff0c;一次性令牌&#xff0c;全局…

Linux 实现网页劫持,Linux下实现劫持系统调用的总结(上)--代码及实现

godbach2015-04-07 19:03yzh07137&#xff1a;你好&#xff0c;我看了你的这篇关于linux劫持open调用的文章[url]http://bbs.chinaunix.net/thread-1946913-1-1.html[/url](有点久远了)我在ubuntu12.04.5(内核是3.13.0.20-32-generic)上试验了&#xff0c;结果编译报错了&#…

python下载之后无法启动_安装后启动时,适用于Python的Eric IDE崩溃

On Windows 7 I successfully installed Python 3.73 and then installed Eric 6, the Python IDE. 安装似乎已成功&#xff0c;但是当我启动Eric时&#xff0c;将打开一个窗口&#xff0c;然后出现错误弹出窗口&#xff0c;提示Python已停止。 我非常感谢您为解决此问题提供的…

深度linux更新卡,深度操作系统已发布更新 新增“ apt-get custom-update”命令行

深度操作系统现已发布最新更新&#xff0c;新增“apt-getcustom-update”命令行&#xff0c;支持指定源更新&#xff0c;同时修复了关闭检查应用商店的应用更新后不生效的问题。此外&#xff0c;使用快捷键“ctrlaltR”进行录屏实际触发为截图的问题也已修复。值得一提的是&…

苹果笔记本macbook pro如何安装python_在Mac上兼容安装Python3并保留原先的Python2.7

前言 博主的电脑为2017款macbook pro &#xff0c;电脑自带python2.7版本&#xff0c;在网上查资料得知由于很多系统服务依赖于自带的2.7py&#xff0c;所以不敢卸载&#xff0c;因此只能安装双兼容python&#xff0c;这里以Python3.7版本为例。 1、安装Xcode Command Line Too…

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…

Apache Derby数据库用户和权限

抽象 Apache Derby很棒&#xff01; 尤其是在微服务环境中&#xff0c;服务的数据&#xff08;可能&#xff09;会缩减&#xff0c;并且不需要更强大的RDBMS。 Derby很棒&#xff0c;因为它非常易于使用&#xff0c;尤其是在涉及用户和权限时&#xff0c;您不需要任何东西&…