SpringBoot+拦截器+自定义异常+自定义注解+全局异常处理简单实现接口权限管理...
点击关注公众号,实用技术文章及时了解
来源:blog.csdn.net/weixin_44102992/article/
details/107335702
前言
提到权限管理这块肯定很多人第一想到的就是Springboot Security或者是Shiro安全框架,但本文介绍的并不是这两种,不是因为他们不好用,实在是自己太懒了,我觉得一个拦截器加上其他的一些处理就能满足项目的需求,我又何必去多用一个框架呢,这篇文章也不是去对比谁好谁坏,各位自行抉择。
我将权限管理分为三块:
资源权限:将url当做资源,可以给每个账号动态划分Url权限,访问不同的URl;
操作权限:将所有URL分为增、删、改、查4种操作权限,给用户分配对应的操作权限,如某个用户只有查操作权限那么他就无法做其他的操作;
角色权限:系统有多个角色,每个角色的权限都不同,如一个管理后台有着账号管理模块、商品模块等,为超级管理员的角色就可以看到所有模块并操作,而为售后的角色就只能看到商品模块,即使他知道账号管理模块下的URL也无权限操作。然后为用户设置角色就有对应的权限;
资源权限
1.静态资源准备
这里方便演示就不直接操作数据库了,对应的权限建表关系也很简单,这里直接建立静态的用户对应的URL关系。
public class Constant {/*** 权限管理*/public static Map<Integer,String[]> permission=new HashMap<>();static {String[] frist={"/url1","/url2","/url3","/url4","/url5","/url6","/url7"};//用户1所拥有的URL权限String[] second={"/url1","/url2","/url3","/url4","/url5"};//用户2所拥有的URL权限String[] third={"/url1","/url2","/url3"};//用户3所拥有的URL权限permission.put(1,frist);permission.put(2,second);permission.put(3,third);}
}
2.自定义一个异常,便于拦截抛出
public class APIException extends RuntimeException {private static final long serialVersionUID = 1L;private String msg;public APIException(String msg) {super(msg);this.msg = msg;}}
3.全局异常处理
便于异常后返回统一规范的结果,正常应该是正常返回自定义Vo,但这里目标是为了演示结果,再加上各位应该都有自己的Vo类,所以这里就不用了
@RestControllerAdvice
public class WebExceptionControl {@ExceptionHandler(APIException.class)public String APIExceptionHandler(APIException e) {return e.getMessage();}
}
4.controller层
很简单创建对应的URL就好
5.拦截器创建
一般是要先验证token,后根据token取到用户对应信息,这里没有登录所以就直接在token里传对应用户的key值了
/*** 权限管理URL拦截器*/
public class URLInterceptor implements HandlerInterceptor {// 预处理回调方法,在接口调用之前使用 true代表放行 false代表不放行@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {HttpServletRequest httpServletRequest = (HttpServletRequest) request;String token = httpServletRequest.getHeader("token");String requestURL = httpServletRequest.getRequestURI();//1.根据token判断用户是否登录if (token==null){ //正常情况下这里还需判断与redis中的token是否匹配// 如果没有token或者token不匹配, 直接抛出异常 提示未登录throw new APIException("当前用户未登录");}//2.登录成功后 根据用户token中的信息获取到用户对应的URL权限集合String[] strings = Constant.permission.get(Integer.valueOf(token));boolean hasPermission = false;//3.再根据用户对应的URL集合去与当前请求的URL对比 有匹配的则放行 反之则抛出异常for (int i =0;i<strings.length;i++) {if (strings[i].equals(requestURL)){hasPermission = true;break;}}if (hasPermission){return true;}else {throw new APIException("当前用户没有访问路径" + requestURL + "的权限");}}
}
6.将拦截器注入应用
@Configuration
public class WebMvcConfg implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {//权限拦截器registry.addInterceptor(urlInterceptor()).addPathPatterns("/**");}@Beanpublic URLInterceptor urlInterceptor(){return new URLInterceptor();}
}
7.验证查看结果
分别在token中传入用户1-3的key,访问不同url就可以看到效果,如下
操作权限
1.和上面一样使用静态资源
public class Constant {/*** 权限管理*/public static Map<Integer,String[]> permission=new HashMap<>();static {String[] frist={"insert","delete","select","update"};//用户1所拥有的操作权限String[] second={"insert","select","update"};//用户2所拥有的URL权限String[] third={"select"};//用户3所拥有的URL权限permission.put(1,frist);permission.put(2,second);permission.put(3,third);}
}
2.自定义注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface UrlAnnotation {/*** 操作类型(type):添加,删除,修改,插入* */String type();
}
3.controller层
打上自定义的注解,代表对应方法是什么操作
4.修改一下之前的拦截器
添加对注解上面的操作类型的获取,并用type类型去对比判断
5.验证结果
其他都不变
角色权限
这里其实和上面的操作大同小异,我这里简单演示一下,以两个模块为例
1.静态对应关系
public class Constant {/*** 权限管理*/public static Map<Integer,String[]> permission=new HashMap<>();static {String[] frist={"test","test1"};//用户1所拥有的模块权限 这里的test是模块URL入口 例如:test模块下所有URL都是/test/**String[] second={"test"};//用户2所拥有的模块权限permission.put(1,frist); //这里的1其实是用户对应ID为1的角色permission.put(2,second);//这个2同理}
2.修改controller
模拟两个模块
3.修改一下拦截器
4.结果测试
总结
其实用自定义的拦截器去做权限,不管是什么类型其实都大同小异,根据需求灵活的去处理才是最重要的,上面的静态权限变通一下,建立角色表、用户表、路径表以及对应关系,就很容易做出URL的动态权限配置了,灵活运用自定义注解搭配可以做到更细致。
推荐
主流Java进阶技术(学习资料分享)
Java面试题宝典
加入Spring技术开发社区
PS:因为公众号平台更改了推送规则,如果不想错过内容,记得读完点一下“在看”,加个“星标”,这样每次新文章推送才会第一时间出现在你的订阅列表里。点“在看”支持我们吧!
SpringBoot+拦截器+自定义异常+自定义注解+全局异常处理简单实现接口权限管理...相关推荐
- SpringBoot 拦截器和AOP自定义注解进行数据拦截实例
声明:本文纯属个人随手笔记,如果对您有参考价值我十分开心,如果有存在错误,或者有更好的解决办法也麻烦您留言告诉我,大家共同成长,切勿恶言相. 欢迎加入资源共享QQ群:275343679,一起发现知识. ...
- SpringBoot拦截器配置
SpringBoot拦截器配置 自定义拦截器: com.example.mybatis2018.interceptor.MyInterCeptor package com.example.mybati ...
- springboot + 拦截器 + 注解 实现自定义权限验证
springboot + 拦截器 + 注解 实现自定义权限验证 最近用到一种前端模板技术:jtwig,在权限控制上没有用springSecurity.因此用拦截器和注解结合实现了权限控制. 1.1 定 ...
- 在SpringBoot项目中,自定义注解+拦截器优雅的实现敏感数据的加解密!
在实际生产项目中,经常需要对如身份证信息.手机号.真实姓名等的敏感数据进行加密数据库存储,但在业务代码中对敏感信息进行手动加解密则十分不优雅,甚至会存在错加密.漏加密.业务人员需要知道实际的加密规则等 ...
- 【SpringBoot】SpringBoot拦截器实战和 Servlet3.0自定义Filter、Listener
=================6.SpringBoot拦截器实战和 Servlet3.0自定义Filter.Listener ============ 1.深入SpringBoot2.x过滤器Fi ...
- springboot拦截器 跳过_springboot创建拦截器过程图解
springboot创建拦截器过程图解 这篇文章主要介绍了springboot创建拦截器过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一. ...
- springboot 拦截器_Spring Boot入门系列(十)如何使用拦截器,一学就会!
前面介绍了Spring Boot 如何整合定时任务已经Spring Boot 如何创建异步任务,不清楚的朋友可以看看之前的文章:https://www.cnblogs.com/zhangweizhon ...
- springboot项目系列-论坛系统05全局异常处理+日志处理+MD5加密
springboot项目系列-论坛系统05全局异常处理+日志处理使用了spring的AOP 论坛地址:http://www.cywloveyou.top 配置日志 logging:level:root ...
- SpringBoot拦截器与过滤器
一.拦截器与过滤器 在讲Spring boot之前,我们先了解一下过滤器和拦截器.这两者在功能方面很类似,但是在具体技术实现方面,差距还是比较大的.在分析两者的区别之前,我们先理解一下AOP的概念,A ...
最新文章
- 最全整理 | 万字长文综述目标检测领域,您要的,都在这里!
- TalkingData CTO肖文峰:研发工程师,你为啥升不上去?
- chrome88 android,Chrome 88 的新特性
- 修改Docker0网桥默认网段
- [云炬创业基础笔记]第二章创业者测试13
- php artisan 命令列表
- java的数据类型、变量类型笔记总结
- 程序员转实施工程师_只有程序员才能看得懂?程序员:算了,不看了,我得写代码了...
- 使用 Blazor 开发内部后台(四):基于Card组件快速搭建导航首页
- python lxml模块解析html_用lxml解析HTML
- 让AI自动调参,才是百度无人车的进化方式:适应环境全靠自己 | 论文
- mysql卸载安装pxc_PXC 5.7.14 安装部署
- java 文档查看技巧
- PLC MODBUS RTU读写IC卡操作
- Unity3D-----摄像机镜头移动并限制角度
- ArcGIS教程:确定空间关系
- 逻辑究竟是什么以及逻辑应当是什么?
- 基于ESP32的蓝牙鼠标键盘(一)BleKeyboard.h函数解析
- 继昨天的猜拳游戏,升级为老虎机版
- html中表格怎么实现下拉,wps表格中的二级下拉菜单怎么做