[pig框架源码分析] 01 - 权限管理系统

2024-03-15 13:30

本文主要是介绍[pig框架源码分析] 01 - 权限管理系统,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • pig白皮书介绍
    • 数据库关系
    • 接口统计
      • 部门
      • 用户
      • 角色
      • 菜单
    • 登录
      • 登录请求
      • 用户信息
      • 导航菜单
    • 参考资料

pig白皮书介绍

权限管理实现

基于角色的访问控制方法(Role-Based Access Control,简称 RBAC)是目前公认的解决大型企业的统一资源访问控制的有效方法。其显著的两大特征是:

  1. 减小授权管理的复杂性,降低管理开销;
  2. 灵活地支持企业的安全策略,并对企业的变化有很大的伸缩性。

提供多租户用户-角色-部门-权限的权限管理模型,确保开发工程师拿来即用。
在这里插入图片描述

数据库关系

sys_user是关键表,从user入手,又分为两块:角色菜单和部门。

用户-角色-菜单,用户和角色是多对多的关系,角色和菜单也是多对多的关系。所以,有两个关系表sys_user_rolesys_role_menu。数据库中查询出所有信息,即可查到一个用户的多个角色,以及相应的菜单和权限。

用户-部门,用户和部门之间是多对一的关系(本系统是这样的),所以在用户表中包含dept_id即可,不需要独立的一张关系表。

在这里插入图片描述

接口统计

通过swagger,我们可以直观的查看出权限管理相关接口。

部门

在这里插入图片描述

用户

在这里插入图片描述

角色

在这里插入图片描述

菜单

在这里插入图片描述

登录

登录逻辑,涉及到授权、用户、权限等,我们这里主要分析后台的密码解密逻辑,下面是浏览器捕获的网络封包请求。
ps: 我们可以直接通过pig提供的在线体验网站进行分析

在这里插入图片描述

登录请求

POST http://localhost:8080/auth/oauth/token?randomStr=90971641286816619&code=1&grant_type=password&scope=server
username: admin
password: YehdBPev

在nacos后台,我们查看配置可以看到,/auth/**请求最后调用的是pig-auth服务,其中有过滤器PasswordDecoderFilter将前端密码解密。
在这里插入图片描述

@Overridepublic GatewayFilter apply(Object config) {return (exchange, chain) -> {ServerHttpRequest request = exchange.getRequest();// 1. 不是登录请求,直接向下执行if (!StrUtil.containsAnyIgnoreCase(request.getURI().getPath(), SecurityConstants.OAUTH_TOKEN_URL)) {return chain.filter(exchange);}// 2. 刷新token类型,直接向下执行String grantType = request.getQueryParams().getFirst("grant_type");if (StrUtil.equals(SecurityConstants.REFRESH_TOKEN, grantType)) {return chain.filter(exchange);}// 3. 前端加密密文解密逻辑Class inClass = String.class;Class outClass = String.class;ServerRequest serverRequest = ServerRequest.create(exchange, messageReaders);// 4. 解密生成新的报文Mono<?> modifiedBody = serverRequest.bodyToMono(inClass).flatMap(decryptAES());……………………
}

pig网关将前端密码解密后,将请求转发给pig-auth服务,该服务基于Spring Security用户认证流程实现,调用堆栈如下:
在这里插入图片描述

用户信息

GET http://localhost:8080/admin/user/info

	@GetMapping(value = { "/info" })public R info() {String username = SecurityUtils.getUser().getUsername();SysUser user = userService.getOne(Wrappers.<SysUser>query().lambda().eq(SysUser::getUsername, username));if (user == null) {return R.failed("获取当前用户信息失败");}UserInfo userInfo = userService.getUserInfo(user);UserInfoVO vo = new UserInfoVO();vo.setSysUser(userInfo.getSysUser());vo.setRoles(userInfo.getRoles());vo.setPermissions(userInfo.getPermissions());return R.ok(vo);}@Slf4j
@Service
@RequiredArgsConstructor
public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> implements SysUserService {@Overridepublic UserInfo getUserInfo(SysUser sysUser) {UserInfo userInfo = new UserInfo();userInfo.setSysUser(sysUser);// 设置角色列表List<SysRole> roleList = sysRoleMapper.listRolesByUserId(sysUser.getUserId());userInfo.setRoleList(roleList);// 设置角色列表 (ID)List<Integer> roleIds = roleList.stream().map(SysRole::getRoleId).collect(Collectors.toList());userInfo.setRoles(ArrayUtil.toArray(roleIds, Integer.class));// 设置权限列表(menu.permission)Set<String> permissions = roleIds.stream().map(sysMenuService::findMenuByRoleId).flatMap(Collection::stream).filter(m -> MenuTypeEnum.BUTTON.getType().equals(m.getType())).map(SysMenu::getPermission).filter(StrUtil::isNotBlank).collect(Collectors.toSet());userInfo.setPermissions(ArrayUtil.toArray(permissions, String.class));return userInfo;}
}

在这里插入图片描述

导航菜单

GET http://localhost:8080/admin/menu?parentId=-1

@GetMappingpublic R getUserMenu(Integer parentId) {// 获取符合条件的菜单Set<SysMenu> menuSet = SecurityUtils.getRoles().stream().map(sysMenuService::findMenuByRoleId).flatMap(Collection::stream).collect(Collectors.toSet());return R.ok(sysMenuService.filterMenu(menuSet, parentId));}

在这里插入图片描述

参考资料

  • 本文章后台代码 https://gitee.com/constellations/pig
  • 本文章前端代码 https://gitee.com/constellations/pig-ui
  • 作者QQ:6307840

这篇关于[pig框架源码分析] 01 - 权限管理系统的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/812129

相关文章

Python实现无痛修改第三方库源码的方法详解

《Python实现无痛修改第三方库源码的方法详解》很多时候,我们下载的第三方库是不会有需求不满足的情况,但也有极少的情况,第三方库没有兼顾到需求,本文将介绍几个修改源码的操作,大家可以根据需求进行选择... 目录需求不符合模拟示例 1. 修改源文件2. 继承修改3. 猴子补丁4. 追踪局部变量需求不符合很

Spring事务中@Transactional注解不生效的原因分析与解决

《Spring事务中@Transactional注解不生效的原因分析与解决》在Spring框架中,@Transactional注解是管理数据库事务的核心方式,本文将深入分析事务自调用的底层原理,解释为... 目录1. 引言2. 事务自调用问题重现2.1 示例代码2.2 问题现象3. 为什么事务自调用会失效3

Python Dash框架在数据可视化仪表板中的应用与实践记录

《PythonDash框架在数据可视化仪表板中的应用与实践记录》Python的PlotlyDash库提供了一种简便且强大的方式来构建和展示互动式数据仪表板,本篇文章将深入探讨如何使用Dash设计一... 目录python Dash框架在数据可视化仪表板中的应用与实践1. 什么是Plotly Dash?1.1

找不到Anaconda prompt终端的原因分析及解决方案

《找不到Anacondaprompt终端的原因分析及解决方案》因为anaconda还没有初始化,在安装anaconda的过程中,有一行是否要添加anaconda到菜单目录中,由于没有勾选,导致没有菜... 目录问题原因问http://www.chinasem.cn题解决安装了 Anaconda 却找不到 An

Spring定时任务只执行一次的原因分析与解决方案

《Spring定时任务只执行一次的原因分析与解决方案》在使用Spring的@Scheduled定时任务时,你是否遇到过任务只执行一次,后续不再触发的情况?这种情况可能由多种原因导致,如未启用调度、线程... 目录1. 问题背景2. Spring定时任务的基本用法3. 为什么定时任务只执行一次?3.1 未启用

基于Flask框架添加多个AI模型的API并进行交互

《基于Flask框架添加多个AI模型的API并进行交互》:本文主要介绍如何基于Flask框架开发AI模型API管理系统,允许用户添加、删除不同AI模型的API密钥,感兴趣的可以了解下... 目录1. 概述2. 后端代码说明2.1 依赖库导入2.2 应用初始化2.3 API 存储字典2.4 路由函数2.5 应

Python GUI框架中的PyQt详解

《PythonGUI框架中的PyQt详解》PyQt是Python语言中最强大且广泛应用的GUI框架之一,基于Qt库的Python绑定实现,本文将深入解析PyQt的核心模块,并通过代码示例展示其应用场... 目录一、PyQt核心模块概览二、核心模块详解与示例1. QtCore - 核心基础模块2. QtWid

C++ 各种map特点对比分析

《C++各种map特点对比分析》文章比较了C++中不同类型的map(如std::map,std::unordered_map,std::multimap,std::unordered_multima... 目录特点比较C++ 示例代码 ​​​​​​代码解释特点比较1. std::map底层实现:基于红黑

最新Spring Security实战教程之Spring Security安全框架指南

《最新SpringSecurity实战教程之SpringSecurity安全框架指南》SpringSecurity是Spring生态系统中的核心组件,提供认证、授权和防护机制,以保护应用免受各种安... 目录前言什么是Spring Security?同类框架对比Spring Security典型应用场景传统

SpringSecurity 认证、注销、权限控制功能(注销、记住密码、自定义登入页)

《SpringSecurity认证、注销、权限控制功能(注销、记住密码、自定义登入页)》SpringSecurity是一个强大的Java框架,用于保护应用程序的安全性,它提供了一套全面的安全解决方案... 目录简介认识Spring Security“认证”(Authentication)“授权” (Auth