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

SpringBooturi统一权限管理的实现方法及步骤详解

本文详细介绍了SpringBoot中实现uri统一权限管理的方法,包括表结构定义、自动统计URI并自动删除脏数据、程序启动加载等步骤。通过该方法可以提高系统的安全性,实现对系统任意接口的权限拦截验证。


文章目录

  • SpringBoot uri统一权限管理
    • 1. 表结构定义
    • 2. 自动统计URI,并自动删除脏数据
    • 3. 程序启动加载
    • 4. 结果
    • 5. 其他


SpringBoot uri统一权限管理

业务需求:为了增加系统的安全性,系统的任意一个接口均要做权限拦截验证。


1. 表结构定义

CREATE TABLE `sys_uri` (`id` bigint(11) NOT NULL AUTO_INCREMENT COMMENT 'id',`bean_name` varchar(128) DEFAULT NULL COMMENT 'controller类名',`uri` varchar(256) DEFAULT NULL COMMENT '访问地址',`clazz_name` varchar(256) DEFAULT NULL COMMENT '类名',`create_time` datetime DEFAULT NULL COMMENT '创建时间',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=44 DEFAULT CHARSET=utf8 COMMENT='系统uri记录表';CREATE TABLE `role_uri_authority` (`id` bigint(11) NOT NULL AUTO_INCREMENT COMMENT 'id 自增',`role_id` bigint(11) NOT NULL COMMENT '角色id,对应角色表roles主键',`sys_uri_id` bigint(11) NOT NULL COMMENT 'sys_uri表中的主键id',PRIMARY KEY (`id`),KEY `role_id` (`role_id`),KEY `sys_uri_id` (`sys_uri_id`)
) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8 COMMENT='角色uri权限访问表';

2. 自动统计URI,并自动删除脏数据

直接上service,

@Service
public class UriInitServiceImpl implements UriInitService {// 排除swagger与其他内置的uri;排序用户登录模块,以及内部测试模块controllerprivate static final List<String> excludesControllerList &#61;Stream.of("apiResourceController", "knife4jController", "basicErrorController", "loginController", "thymeleafTest", "testController").collect(Collectors.toList());// SpringBoot 内置对象,可获取controller所有的uri信息&#64;Autowiredprivate RequestMappingHandlerMapping requestMappingHandlerMapping;// 逆向工程自动生成dao&#64;Autowiredprivate RoleUriAuthMapperExt roleUriAuthMapperExt;// 逆向工程自动生成dao&#64;Autowiredprivate SysUriMapperExt sysUriMapperExt;private Date sysDate;&#64;Transactional&#64;Overridepublic void initSysUri() {// 全量uriList<SysUri> sysUriList &#61; new ArrayList<>();sysDate &#61; new Date();// 获取系统所有的uri信息Map<RequestMappingInfo, HandlerMethod> handlerMethodsMap &#61; requestMappingHandlerMapping.getHandlerMethods();for (Map.Entry<RequestMappingInfo, HandlerMethod> item : handlerMethodsMap.entrySet()) {saveUriMap(sysUriList, item);}// 原有的存量数据List<SysUri> oldSysUriList &#61; sysUriMapperExt.selectByExample(new SysUriExample());// sysUriList - oldSysUriList 新增差集List<SysUri> addSysUriList &#61; sysUriList.stream().filter(s -> !oldSysUriList.stream().map(os -> os.getUri()).collect(Collectors.toList()).contains(s.getUri())).collect(Collectors.toList());// oldSysUriList - sysUriList 移除差集List<Long> reduceSysUriIdList &#61; oldSysUriList.stream().filter(os -> !sysUriList.stream().map(s -> s.getUri()).collect(Collectors.toList()).contains(os.getUri())).map(item -> item.getId()).collect(Collectors.toList());// sysUri 新增if (!CollectionUtils.isEmpty(addSysUriList)) {sysUriMapperExt.batchInsert(addSysUriList);}// sysUri,roleUriAuth删除已清除的uriif (!CollectionUtils.isEmpty(reduceSysUriIdList)) {SysUriExample example &#61; new SysUriExample();example.createCriteria().andIdIn(reduceSysUriIdList);sysUriMapperExt.deleteByExample(example);RoleUriAuthExample roleUriAuthExample &#61; new RoleUriAuthExample();roleUriAuthExample.createCriteria().andSysUriIdIn(reduceSysUriIdList);roleUriAuthMapperExt.deleteByExample(roleUriAuthExample);}}// 过滤映射转换private void saveUriMap(List<SysUri> sysUriList, Map.Entry<RequestMappingInfo, HandlerMethod> item) {RequestMappingInfo uriMappingInfo &#61; item.getKey();HandlerMethod value &#61; item.getValue();String uri &#61; uriMappingInfo.getPatternsCondition().toString();// 类名:xxxControllerString beanName &#61; value.getBean().toString();// clazz全路径名称String clazzName &#61; value.getBeanType().getName();if (!excludesControllerList.contains(beanName)) {SysUri sysUri &#61; new SysUri();sysUri.setBeanName(beanName);sysUri.setUri(uri);sysUri.setClazzName(clazzName);sysUri.setCreateTime(sysDate);sysUriList.add(sysUri);}}
}

3. 程序启动加载

&#64;Service
public class StartupListener implements ApplicationListener<ContextRefreshedEvent> {private Logger logger &#61; LoggerFactory.getLogger(StartupListener.class);&#64;Autowiredprivate UriInitService uriInitService;/*** 触发机制* 容器中所有的bean初始化完成之后执行** &#64;param evt*/&#64;Overridepublic void onApplicationEvent(ContextRefreshedEvent evt) {try {// 保证只执行一次if (evt.getApplicationContext().getParent() &#61;&#61; null) {// 程序启动初始化uriuriInitService.initSysUri();}} catch (Exception e) {logger.error("onApplicationEvent error {}", e.getMessage());// 异常 强制关闭启动throw new RuntimeException(e.getMessage());}}}

4. 结果

在这里插入图片描述


5. 其他

以上为各个系统通用模块。
其他拦截器验证业务&#xff0c;缓存等代码根据自身系统开发。


推荐阅读
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • 本文介绍了OpenStack的逻辑概念以及其构成简介,包括了软件开源项目、基础设施资源管理平台、三大核心组件等内容。同时还介绍了Horizon(UI模块)等相关信息。 ... [详细]
  • 本文介绍了使用Spark实现低配版高斯朴素贝叶斯模型的原因和原理。随着数据量的增大,单机上运行高斯朴素贝叶斯模型会变得很慢,因此考虑使用Spark来加速运行。然而,Spark的MLlib并没有实现高斯朴素贝叶斯模型,因此需要自己动手实现。文章还介绍了朴素贝叶斯的原理和公式,并对具有多个特征和类别的模型进行了讨论。最后,作者总结了实现低配版高斯朴素贝叶斯模型的步骤。 ... [详细]
  • 电话号码的字母组合解题思路和代码示例
    本文介绍了力扣题目《电话号码的字母组合》的解题思路和代码示例。通过使用哈希表和递归求解的方法,可以将给定的电话号码转换为对应的字母组合。详细的解题思路和代码示例可以帮助读者更好地理解和实现该题目。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 有没有一种方法可以在不继承UIAlertController的子类或不涉及UIAlertActions的情况下 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • 如何查询zone下的表的信息
    本文介绍了如何通过TcaplusDB知识库查询zone下的表的信息。包括请求地址、GET请求参数说明、返回参数说明等内容。通过curl方法发起请求,并提供了请求示例。 ... [详细]
  • 本文讨论了编写可保护的代码的重要性,包括提高代码的可读性、可调试性和直观性。同时介绍了优化代码的方法,如代码格式化、解释函数和提炼函数等。还提到了一些常见的坏代码味道,如不规范的命名、重复代码、过长的函数和参数列表等。最后,介绍了如何处理数据泥团和进行函数重构,以提高代码质量和可维护性。 ... [详细]
author-avatar
仔仔衰才_887
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有