热门标签 | 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;缓存等代码根据自身系统开发。


推荐阅读
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 本文介绍如何使用 Python 将一个字符串按照指定的行和元素分隔符进行两次拆分,最终将字符串转换为矩阵形式。通过两种不同的方法实现这一功能:一种是使用循环与 split() 方法,另一种是利用列表推导式。 ... [详细]
  • 本文详细介绍了Java中org.neo4j.helpers.collection.Iterators.single()方法的功能、使用场景及代码示例,帮助开发者更好地理解和应用该方法。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 主要用了2个类来实现的,话不多说,直接看运行结果,然后在奉上源代码1.Index.javaimportjava.awt.Color;im ... [详细]
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
  • 深入解析Spring Cloud Ribbon负载均衡机制
    本文详细介绍了Spring Cloud中的Ribbon组件如何实现服务调用的负载均衡。通过分析其工作原理、源码结构及配置方式,帮助读者理解Ribbon在分布式系统中的重要作用。 ... [详细]
  • 360SRC安全应急响应:从漏洞提交到修复的全过程
    本文详细介绍了360SRC平台处理一起关键安全事件的过程,涵盖从漏洞提交、验证、排查到最终修复的各个环节。通过这一案例,展示了360在安全应急响应方面的专业能力和严谨态度。 ... [详细]
  • 本文详细探讨了KMP算法中next数组的构建及其应用,重点分析了未改良和改良后的next数组在字符串匹配中的作用。通过具体实例和代码实现,帮助读者更好地理解KMP算法的核心原理。 ... [详细]
  • 数据管理权威指南:《DAMA-DMBOK2 数据管理知识体系》
    本书提供了全面的数据管理职能、术语和最佳实践方法的标准行业解释,构建了数据管理的总体框架,为数据管理的发展奠定了坚实的理论基础。适合各类数据管理专业人士和相关领域的从业人员。 ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 在金融和会计领域,准确无误地填写票据和结算凭证至关重要。这些文件不仅是支付结算和现金收付的重要依据,还直接关系到交易的安全性和准确性。本文介绍了一种使用C语言实现小写金额转换为大写金额的方法,确保数据的标准化和规范化。 ... [详细]
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社区 版权所有