点击关注公众号,实用技术文章及时了解

来源:blog.csdn.net/weixin_44102992/article/

details/107335702

前言

提到权限管理这块肯定很多人第一想到的就是Springboot Security或者是Shiro安全框架,但本文介绍的并不是这两种,不是因为他们不好用,实在是自己太懒了,我觉得一个拦截器加上其他的一些处理就能满足项目的需求,我又何必去多用一个框架呢,这篇文章也不是去对比谁好谁坏,各位自行抉择。

我将权限管理分为三块:

  1. 资源权限:将url当做资源,可以给每个账号动态划分Url权限,访问不同的URl;

  2. 操作权限:将所有URL分为增、删、改、查4种操作权限,给用户分配对应的操作权限,如某个用户只有查操作权限那么他就无法做其他的操作;

  3. 角色权限:系统有多个角色,每个角色的权限都不同,如一个管理后台有着账号管理模块、商品模块等,为超级管理员的角色就可以看到所有模块并操作,而为售后的角色就只能看到商品模块,即使他知道账号管理模块下的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+拦截器+自定义异常+自定义注解+全局异常处理简单实现接口权限管理...相关推荐

  1. SpringBoot 拦截器和AOP自定义注解进行数据拦截实例

    声明:本文纯属个人随手笔记,如果对您有参考价值我十分开心,如果有存在错误,或者有更好的解决办法也麻烦您留言告诉我,大家共同成长,切勿恶言相. 欢迎加入资源共享QQ群:275343679,一起发现知识. ...

  2. SpringBoot拦截器配置

    SpringBoot拦截器配置 自定义拦截器: com.example.mybatis2018.interceptor.MyInterCeptor package com.example.mybati ...

  3. springboot + 拦截器 + 注解 实现自定义权限验证

    springboot + 拦截器 + 注解 实现自定义权限验证 最近用到一种前端模板技术:jtwig,在权限控制上没有用springSecurity.因此用拦截器和注解结合实现了权限控制. 1.1 定 ...

  4. 在SpringBoot项目中,自定义注解+拦截器优雅的实现敏感数据的加解密!

    在实际生产项目中,经常需要对如身份证信息.手机号.真实姓名等的敏感数据进行加密数据库存储,但在业务代码中对敏感信息进行手动加解密则十分不优雅,甚至会存在错加密.漏加密.业务人员需要知道实际的加密规则等 ...

  5. 【SpringBoot】SpringBoot拦截器实战和 Servlet3.0自定义Filter、Listener

    =================6.SpringBoot拦截器实战和 Servlet3.0自定义Filter.Listener ============ 1.深入SpringBoot2.x过滤器Fi ...

  6. springboot拦截器 跳过_springboot创建拦截器过程图解

    springboot创建拦截器过程图解 这篇文章主要介绍了springboot创建拦截器过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一. ...

  7. springboot 拦截器_Spring Boot入门系列(十)如何使用拦截器,一学就会!

    前面介绍了Spring Boot 如何整合定时任务已经Spring Boot 如何创建异步任务,不清楚的朋友可以看看之前的文章:https://www.cnblogs.com/zhangweizhon ...

  8. springboot项目系列-论坛系统05全局异常处理+日志处理+MD5加密

    springboot项目系列-论坛系统05全局异常处理+日志处理使用了spring的AOP 论坛地址:http://www.cywloveyou.top 配置日志 logging:level:root ...

  9. SpringBoot拦截器与过滤器

    一.拦截器与过滤器 在讲Spring boot之前,我们先了解一下过滤器和拦截器.这两者在功能方面很类似,但是在具体技术实现方面,差距还是比较大的.在分析两者的区别之前,我们先理解一下AOP的概念,A ...

最新文章

  1. 最全整理 | 万字长文综述目标检测领域,您要的,都在这里!
  2. TalkingData CTO肖文峰:研发工程师,你为啥升不上去?
  3. chrome88 android,Chrome 88 的新特性
  4. 修改Docker0网桥默认网段
  5. [云炬创业基础笔记]第二章创业者测试13
  6. php artisan 命令列表
  7. java的数据类型、变量类型笔记总结
  8. 程序员转实施工程师_只有程序员才能看得懂?程序员:算了,不看了,我得写代码了...
  9. 使用 Blazor 开发内部后台(四):基于Card组件快速搭建导航首页
  10. python lxml模块解析html_用lxml解析HTML
  11. 让AI自动调参,才是百度无人车的进化方式:适应环境全靠自己 | 论文
  12. mysql卸载安装pxc_PXC 5.7.14 安装部署
  13. java 文档查看技巧
  14. PLC MODBUS RTU读写IC卡操作
  15. Unity3D-----摄像机镜头移动并限制角度
  16. ArcGIS教程:确定空间关系
  17. 逻辑究竟是什么以及逻辑应当是什么?
  18. 基于ESP32的蓝牙鼠标键盘(一)BleKeyboard.h函数解析
  19. 继昨天的猜拳游戏,升级为老虎机版
  20. html中表格怎么实现下拉,wps表格中的二级下拉菜单怎么做

热门文章

  1. iPhone12年简史:手机之王的荣耀与溃败
  2. 罗永浩或将找陈冠希做代言人
  3. 善用AI技术,旷视发布《人工智能应用准则》
  4. 特斯拉明年会有100万辆自动驾驶出租车 你敢坐吗?
  5. 4月1日见!小米9王源定制版官宣:透明版背壳加持
  6. 中国银联深夜道歉 称将进一步优化赔偿机制
  7. 挺住!锤子新机研发停滞、全部机型官网无货 电商平台降价促销...
  8. 40岁老码农面试京东被淘汰,HR感叹:40岁混不到高管,都会被清退
  9. 前端、后台和连接前端后台的网络数据传输
  10. 二级公共基础知识_计算机系统习题,二级公共基础知识新增章节