# pms-backend **Repository Path**: freefactor/pms-backend ## Basic Information - **Project Name**: pms-backend - **Description**: 统一权限平台后端项目 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-06-23 - **Last Updated**: 2025-06-23 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # pms-backend ## 一、项目介绍 项目名为pms(Permission Management System)权限管理系统,又称统一权限平台,简称权限平台。 可以通过这个平台管理你所有应用的用户、角色、权限(资源)等信息。 - 将权限控制相关的表结构从所有项目中分离 - 需要获取指定应用的权限信息,只需要通过发送RPC请求到对应的接口 ## 二、技术介绍 ### 1、前端技术 | 技术 | 说明 | 官网 | | ------------- | ---------------------------------- | ------------------------------ | | JQuery Easyui | 前端UI框架(用于快速创建管理页面) | https://www.jeasyui.net/ | | JQuery | Javascript库(网页脚本语言库) | https://jquery.com/ | | Ajax | 前后端交互框架 | https://learn.jquery.com/ajax/ | | HTML | 超文本标记语言(网页编程语言) | https://html.com/ | | CSS | 层叠样式表(网页样式语言) | https://www.w3.org/Style/CSS/ | ### 2、后端技术 | 技术 | 说明 | 官网 | | ------------ | ---------------- | ------------------------------------------- | | Spring Boot | 容器+MVC框架 | https://spring.io/projects/spring-boot | | Apache Shiro | 认证和授权框架 | https://shiro.apache.org/ | | MyBatis | ORM框架 | https://blog.mybatis.org/ | | MyBatis-Plus | MyBatis增强工具 | https://www.baomidou.com/ | | Knife4j | 接口文档生成工具 | https://doc.xiaominfo.com/docs/quick-start/ | | Redis | 分布式缓存数据库 | https://redis.io/ | | Fastjson | 序列化工具 | https://github.com/alibaba/fastjson | | Easy Excel | 操作excel的工具 | https://easyexcel.opensource.alibaba.com/ | ## 三、接口介绍 ### 1、/permission/resources 功能说明:初始化应用权限。 参数说明:该接口需要接收两个参数 - 应用名:service - 权限列表:permissions permissions是通过资源扫描工具类ResourceScanner扫描得到的应用的所有权限。 ### 2、/permission/selectPermissions 功能说明:查询指定应用service的所有非匿名子权限。 参数说明 - 该接口需要接收一个参数service,表示应用名。 - service就是项目名,通常就是配置文件中spring.application.name配置的值。 ### 3、/permission/selectUserPermissions 功能说明:查询用户权限,这个接口查询的是权限值,详情参考[Shiro的通配符权限](https://shiro.apache.org/permissions.html#wildcard_permissions)。 参数说明:该接口需要接收两个参数 - 应用名(服务名):service - 用户名:username > 因为本系统保存的是所有应用的权限,通过permission表的service_id字段区分权限属于哪个应用。 > > 在查询指定应用的权限时,需要把应用名作为参数一起传递,在本系统中通过应用名就能查询到应用的ID,从而查询指定应用ID关联的权限。 ## 四、对接说明 ### 跨域鉴权 跨域的权限问题: 项目中使用Apache Shiro实现权限访问控制,通过当前的用户名关联用户表、角色表、用户角色表、权限表、角色权限表查询用户的权限,并(通过缓存管理器)缓存到redis中。 RPC请求由于没有登录也无法登陆当前系统,所以也无法获取RPC请求的用户及权限,所有权限校验都会失败。 本项目中解决跨域问题: 在配置文件application.yml中设置了feign请求头的名称和值,只有携带了名称为header.feign.name配置的请求头,并且请求头的值为header.feign.value配置的加密之前的值的请求会跳过鉴权。 **否则,RPC请求统统都会因为权限访问控制而失败。** ------ 配置项header.feign.value的值是通过PasswordMatcher的encode()方法加密后的字符串。 ```yml header: # feign请求头设置 feign: name: access-key value: 049d7857f8a34109a87e691f767497e826e63d66d391a4edea42409cf7486a36 # pms-backend ``` 例如:要设置请求头的值为12345,则header.feign.value的值为PasswordMatcher.encode("12345") ------ ### 解决方案 为了解决跨域的权限问题,需要在服务消费端设置Feign的请求拦截器,为feign请求添加对应的请求头。 ```java package xxx.xxx.feign.interceptor; import cn.edu.sgu.www.mhxysy.config.property.FeignHeaderProperties; import feign.RequestInterceptor; import feign.RequestTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; /** * feign请求头拦截器 * @author 沐雨橙风ιε * @version 1.0 */ @Component public class RequestHeaderInterceptor implements RequestInterceptor { private final String headerName; private final String headerValue; @Autowired public RequestHeaderInterceptor(FeignHeaderProperties feignHeaderProperties) { headerName = feignHeaderProperties.getName(); headerValue = feignHeaderProperties.getValue(); } @Override public void apply(RequestTemplate template) { template.header(headerName, headerValue); } } ``` FeignHeaderProperties.java是一个配置文件的读取类。 ```java package xxx.xxx.config.property; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; /** * Feign请求头设置 * @author 沐雨橙风ιε * @version 1.0 */ @Data @Component @ConfigurationProperties(prefix = "header.feign") public class FeignHeaderProperties { /** * 请求头名称 */ private String name; /** * 请求头值 */ private String value; } ``` application.yml中添加请求头配置项。 ```yml header: # feign请求头设置 feign: name: access-key value: pms-backend ```