[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

相关文章

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

Springboot中分析SQL性能的两种方式详解

《Springboot中分析SQL性能的两种方式详解》文章介绍了SQL性能分析的两种方式:MyBatis-Plus性能分析插件和p6spy框架,MyBatis-Plus插件配置简单,适用于开发和测试环... 目录SQL性能分析的两种方式:功能介绍实现方式:实现步骤:SQL性能分析的两种方式:功能介绍记录

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动

浅析如何使用Swagger生成带权限控制的API文档

《浅析如何使用Swagger生成带权限控制的API文档》当涉及到权限控制时,如何生成既安全又详细的API文档就成了一个关键问题,所以这篇文章小编就来和大家好好聊聊如何用Swagger来生成带有... 目录准备工作配置 Swagger权限控制给 API 加上权限注解查看文档注意事项在咱们的开发工作里,API

修改若依框架Token的过期时间问题

《修改若依框架Token的过期时间问题》本文介绍了如何修改若依框架中Token的过期时间,通过修改`application.yml`文件中的配置来实现,默认单位为分钟,希望此经验对大家有所帮助,也欢迎... 目录修改若依框架Token的过期时间修改Token的过期时间关闭Token的过期时js间总结修改若依

C#使用DeepSeek API实现自然语言处理,文本分类和情感分析

《C#使用DeepSeekAPI实现自然语言处理,文本分类和情感分析》在C#中使用DeepSeekAPI可以实现多种功能,例如自然语言处理、文本分类、情感分析等,本文主要为大家介绍了具体实现步骤,... 目录准备工作文本生成文本分类问答系统代码生成翻译功能文本摘要文本校对图像描述生成总结在C#中使用Deep

Go中sync.Once源码的深度讲解

《Go中sync.Once源码的深度讲解》sync.Once是Go语言标准库中的一个同步原语,用于确保某个操作只执行一次,本文将从源码出发为大家详细介绍一下sync.Once的具体使用,x希望对大家有... 目录概念简单示例源码解读总结概念sync.Once是Go语言标准库中的一个同步原语,用于确保某个操

Java访问修饰符public、private、protected及默认访问权限详解

《Java访问修饰符public、private、protected及默认访问权限详解》:本文主要介绍Java访问修饰符public、private、protected及默认访问权限的相关资料,每... 目录前言1. public 访问修饰符特点:示例:适用场景:2. private 访问修饰符特点:示例:

Redis主从/哨兵机制原理分析

《Redis主从/哨兵机制原理分析》本文介绍了Redis的主从复制和哨兵机制,主从复制实现了数据的热备份和负载均衡,而哨兵机制可以监控Redis集群,实现自动故障转移,哨兵机制通过监控、下线、选举和故... 目录一、主从复制1.1 什么是主从复制1.2 主从复制的作用1.3 主从复制原理1.3.1 全量复制

Redis主从复制的原理分析

《Redis主从复制的原理分析》Redis主从复制通过将数据镜像到多个从节点,实现高可用性和扩展性,主从复制包括初次全量同步和增量同步两个阶段,为优化复制性能,可以采用AOF持久化、调整复制超时时间、... 目录Redis主从复制的原理主从复制概述配置主从复制数据同步过程复制一致性与延迟故障转移机制监控与维