You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

403 lines
23 KiB

1 month ago
# 用户安全信息
<cite>
**本文引用的文件**
- [LoginUser.java](file://crm-base/src/main/java/com/crm/base/security/LoginUser.java)
- [SecurityUtils.java](file://crm-base/src/main/java/com/crm/base/security/SecurityUtils.java)
- [AuthLoginUser.java](file://crm-auth/src/main/java/com/crm/auth/security/AuthLoginUser.java)
- [TokenService.java](file://crm-auth/src/main/java/com/crm/auth/security/TokenService.java)
- [JwtAuthenticationFilter.java](file://crm-auth/src/main/java/com/crm/auth/security/JwtAuthenticationFilter.java)
- [DataScopeHelper.java](file://crm-base/src/main/java/com/crm/base/security/DataScopeHelper.java)
- [DataVisibilityContext.java](file://crm-base/src/main/java/com/crm/base/security/DataVisibilityContext.java)
- [DataScope.java](file://crm-base/src/main/java/com/crm/base/annotation/DataScope.java)
- [AuthController.java](file://crm-auth/src/main/java/com/crm/auth/controller/AuthController.java)
- [SystemController.java](file://crm-auth/src/main/java/com/crm/auth/controller/SystemController.java)
- [AuthUser.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/AuthUser.java)
- [SysRole.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysRole.java)
- [SysDept.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysDept.java)
- [SysMenu.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysMenu.java)
- [SysUserRole.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysUserRole.java)
- [SysUserDept.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysUserDept.java)
- [PermissionServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/PermissionServiceImpl.java)
- [AuthService.java](file://crm-auth/src/main/java/com/crm/auth/service/IAuthService.java)
- [AuthUserMapper.java](file://crm-auth/src/main/java/com/crm/auth/mapper/AuthUserMapper.java)
- [SysRoleMapper.java](file://crm-auth/src/main/java/com/crm/auth/mapper/SysRoleMapper.java)
- [SysDeptMapper.java](file://crm-auth/src/main/java/com/crm/auth/mapper/SysDeptMapper.java)
- [SysMenuMapper.java](file://crm-auth/src/main/java/com/crm/auth/mapper/SysMenuMapper.java)
</cite>
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考虑](#性能考虑)
8. [故障排查指南](#故障排查指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
本文件面向“用户安全信息”主题,聚焦以下目标:
- 深入解析 LoginUser 用户信息模型的结构与字段含义(身份、角色权限、部门信息等)。
- 详解 SecurityUtils 工具类提供的安全操作方法(获取当前登录用户、检查权限、验证角色等)。
- 提供在 Controller 与 Service 层正确使用这些工具方法的完整示例路径。
- 总结用户信息缓存策略与安全最佳实践,并给出常见问题与解决方案。
## 项目结构
本项目采用多模块设计,安全相关能力主要分布在 crm-base(基础安全能力)与 crm-auth(认证授权实现)两个模块中:
- crm-base:定义通用安全上下文、数据可见性、权限辅助工具等。
- crm-auth:实现登录、鉴权、JWT 过滤、令牌服务、权限服务等。
```mermaid
graph TB
subgraph "crm-base"
base_login["LoginUser"]
base_utils["SecurityUtils"]
base_scope["DataScopeHelper / DataVisibilityContext / DataScope注解"]
end
subgraph "crm-auth"
auth_login_user["AuthLoginUser"]
token_svc["TokenService"]
jwt_filter["JwtAuthenticationFilter"]
perm_svc["PermissionServiceImpl"]
controllers["AuthController / SystemController"]
entities["AuthUser / SysRole / SysDept / SysMenu / 关联表"]
mappers["*Mapper 接口"]
end
controllers --> jwt_filter
jwt_filter --> token_svc
token_svc --> base_login
base_login --> base_utils
base_utils --> base_scope
perm_svc --> entities
perm_svc --> mappers
controllers --> perm_svc
```
图表来源
- [LoginUser.java:1-200](file://crm-base/src/main/java/com/crm/base/security/LoginUser.java#L1-L200)
- [SecurityUtils.java:1-200](file://crm-base/src/main/java/com/crm/base/security/SecurityUtils.java#L1-L200)
- [AuthLoginUser.java:1-200](file://crm-auth/src/main/java/com/crm/auth/security/AuthLoginUser.java#L1-L200)
- [TokenService.java:1-200](file://crm-auth/src/main/java/com/crm/auth/security/TokenService.java#L1-L200)
- [JwtAuthenticationFilter.java:1-200](file://crm-auth/src/main/java/com/crm/auth/security/JwtAuthenticationFilter.java#L1-L200)
- [DataScopeHelper.java:1-200](file://crm-base/src/main/java/com/crm/base/security/DataScopeHelper.java#L1-L200)
- [DataVisibilityContext.java:1-200](file://crm-base/src/main/java/com/crm/base/security/DataVisibilityContext.java#L1-L200)
- [DataScope.java:1-200](file://crm-base/src/main/java/com/crm/base/annotation/DataScope.java#L1-L200)
- [AuthController.java:1-200](file://crm-auth/src/main/java/com/crm/auth/controller/AuthController.java#L1-L200)
- [SystemController.java:1-200](file://crm-auth/src/main/java/com/crm/auth/controller/SystemController.java#L1-L200)
- [PermissionServiceImpl.java:1-200](file://crm-auth/src/main/java/com/crm/auth/service/impl/PermissionServiceImpl.java#L1-L200)
章节来源
- [LoginUser.java:1-200](file://crm-base/src/main/java/com/crm/base/security/LoginUser.java#L1-L200)
- [SecurityUtils.java:1-200](file://crm-base/src/main/java/com/crm/base/security/SecurityUtils.java#L1-L200)
- [AuthLoginUser.java:1-200](file://crm-auth/src/main/java/com/crm/auth/security/AuthLoginUser.java#L1-L200)
- [TokenService.java:1-200](file://crm-auth/src/main/java/com/crm/auth/security/TokenService.java#L1-L200)
- [JwtAuthenticationFilter.java:1-200](file://crm-auth/src/main/java/com/crm/auth/security/JwtAuthenticationFilter.java#L1-L200)
- [DataScopeHelper.java:1-200](file://crm-base/src/main/java/com/crm/base/security/DataScopeHelper.java#L1-L200)
- [DataVisibilityContext.java:1-200](file://crm-base/src/main/java/com/crm/base/security/DataVisibilityContext.java#L1-L200)
- [DataScope.java:1-200](file://crm-base/src/main/java/com/crm/base/annotation/DataScope.java#L1-L200)
- [AuthController.java:1-200](file://crm-auth/src/main/java/com/crm/auth/controller/AuthController.java#L1-L200)
- [SystemController.java:1-200](file://crm-auth/src/main/java/com/crm/auth/controller/SystemController.java#L1-L200)
- [PermissionServiceImpl.java:1-200](file://crm-auth/src/main/java/com/crm/auth/service/impl/PermissionServiceImpl.java#L1-L200)
## 核心组件
- LoginUser:统一的用户安全上下文对象,承载用户身份、角色、权限、部门、租户等关键信息,作为跨层传递的安全主体。
- AuthLoginUser:认证模块对 LoginUser 的具体实现或扩展,封装认证态下的额外属性。
- SecurityUtils:安全工具类,提供获取当前登录用户、判断是否登录、校验角色/权限、获取数据范围等便捷方法。
- TokenService:负责 JWT 的生成、解析、刷新与校验,维护会话与用户信息的映射。
- JwtAuthenticationFilter:拦截请求,解析 Token,构建 Spring Security 的认证上下文,并将 LoginUser 注入到线程上下文。
- DataScopeHelper / DataVisibilityContext / @DataScope:数据权限与数据可见性控制,基于用户角色与部门进行行级数据隔离。
章节来源
- [LoginUser.java:1-200](file://crm-base/src/main/java/com/crm/base/security/LoginUser.java#L1-L200)
- [AuthLoginUser.java:1-200](file://crm-auth/src/main/java/com/crm/auth/security/AuthLoginUser.java#L1-L200)
- [SecurityUtils.java:1-200](file://crm-base/src/main/java/com/crm/base/security/SecurityUtils.java#L1-L200)
- [TokenService.java:1-200](file://crm-auth/src/main/java/com/crm/auth/security/TokenService.java#L1-L200)
- [JwtAuthenticationFilter.java:1-200](file://crm-auth/src/main/java/com/crm/auth/security/JwtAuthenticationFilter.java#L1-L200)
- [DataScopeHelper.java:1-200](file://crm-base/src/main/java/com/crm/base/security/DataScopeHelper.java#L1-L200)
- [DataVisibilityContext.java:1-200](file://crm-base/src/main/java/com/crm/base/security/DataVisibilityContext.java#L1-L200)
- [DataScope.java:1-200](file://crm-base/src/main/java/com/crm/base/annotation/DataScope.java#L1-L200)
## 架构总览
下图展示了从请求进入、认证、鉴权到业务处理的完整流程,以及用户信息在各层的流转方式。
```mermaid
sequenceDiagram
participant Client as "客户端"
participant API as "控制器(Controller)"
participant Filter as "JwtAuthenticationFilter"
participant Token as "TokenService"
participant Ctx as "SecurityUtils/上下文"
participant Svc as "业务Service"
participant DB as "数据库"
Client->>API : "HTTP 请求(携带Token)"
API->>Filter : "进入过滤器链"
Filter->>Token : "解析并校验Token"
Token-->>Filter : "返回用户信息(LoginUser)"
Filter->>Ctx : "将LoginUser写入线程上下文"
Filter-->>API : "放行请求"
API->>Svc : "调用业务方法"
Svc->>Ctx : "通过SecurityUtils获取当前用户"
Svc->>DB : "执行数据访问(受数据权限影响)"
DB-->>Svc : "返回结果"
Svc-->>API : "返回业务结果"
API-->>Client : "响应"
```
图表来源
- [JwtAuthenticationFilter.java:1-200](file://crm-auth/src/main/java/com/crm/auth/security/JwtAuthenticationFilter.java#L1-L200)
- [TokenService.java:1-200](file://crm-auth/src/main/java/com/crm/auth/security/TokenService.java#L1-L200)
- [SecurityUtils.java:1-200](file://crm-base/src/main/java/com/crm/base/security/SecurityUtils.java#L1-L200)
- [AuthController.java:1-200](file://crm-auth/src/main/java/com/crm/auth/controller/AuthController.java#L1-L200)
- [SystemController.java:1-200](file://crm-auth/src/main/java/com/crm/auth/controller/SystemController.java#L1-L200)
## 详细组件分析
### LoginUser 用户信息模型
- 作用:统一承载当前登录用户的身份信息、角色、权限、部门、租户等,贯穿认证、鉴权与业务处理全链路。
- 关键字段(概念说明):
- 用户标识:唯一用户ID,用于跨系统识别用户。
- 用户名/昵称:展示用名称。
- 角色集合:用户拥有的角色列表,用于权限判定。
- 权限集合:细粒度操作权限(如菜单、按钮、接口级)。
- 部门信息:用户所属部门及层级,支撑数据范围控制。
- 其他扩展:租户ID、设备信息、登录IP等。
- 使用建议:
- 在 Controller/Service 中通过 SecurityUtils 获取 LoginUser,避免直接构造。
- 敏感字段(如密码、密钥)不应出现在 LoginUser 中。
- 如需扩展,优先在 AuthLoginUser 中扩展,保持基础模型稳定。
章节来源
- [LoginUser.java:1-200](file://crm-base/src/main/java/com/crm/base/security/LoginUser.java#L1-L200)
- [AuthLoginUser.java:1-200](file://crm-auth/src/main/java/com/crm/auth/security/AuthLoginUser.java#L1-L200)
### SecurityUtils 工具类
- 功能概览:
- 获取当前登录用户:从线程上下文读取 LoginUser。
- 是否已登录:判断上下文是否存在有效用户。
- 角色/权限校验:快速判断用户是否具备某角色或权限。
- 数据范围辅助:结合 @DataScope 注解与 DataScopeHelper 生成 SQL 条件。
- 典型用法(以路径引用代替代码片段):
- 获取当前用户:参考 [SecurityUtils.java:1-200](file://crm-base/src/main/java/com/crm/base/security/SecurityUtils.java#L1-L200)
- 校验角色:参考 [SecurityUtils.java:1-200](file://crm-base/src/main/java/com/crm/base/security/SecurityUtils.java#L1-L200)
- 校验权限:参考 [SecurityUtils.java:1-200](file://crm-base/src/main/java/com/crm/base/security/SecurityUtils.java#L1-L200)
- 数据范围:参考 [DataScopeHelper.java:1-200](file://crm-base/src/main/java/com/crm/base/security/DataScopeHelper.java#L1-L200)
章节来源
- [SecurityUtils.java:1-200](file://crm-base/src/main/java/com/crm/base/security/SecurityUtils.java#L1-L200)
- [DataScopeHelper.java:1-200](file://crm-base/src/main/java/com/crm/base/security/DataScopeHelper.java#L1-L200)
### 认证与鉴权流程(JwtAuthenticationFilter + TokenService)
- 流程要点:
- 过滤器从请求头提取 Token。
- TokenService 解析并校验 Token,若有效则构建 LoginUser。
- 将 LoginUser 写入线程上下文,供后续业务使用。
- 若无效或缺失,返回未认证错误。
- 时序图(见上文“架构总览”),关键节点对应文件如下:
- 过滤器:[JwtAuthenticationFilter.java:1-200](file://crm-auth/src/main/java/com/crm/auth/security/JwtAuthenticationFilter.java#L1-L200)
- 令牌服务:[TokenService.java:1-200](file://crm-auth/src/main/java/com/crm/auth/security/TokenService.java#L1-L200)
章节来源
- [JwtAuthenticationFilter.java:1-200](file://crm-auth/src/main/java/com/crm/auth/security/JwtAuthenticationFilter.java#L1-L200)
- [TokenService.java:1-200](file://crm-auth/src/main/java/com/crm/auth/security/TokenService.java#L1-L200)
### 权限与数据范围(@DataScope + DataScopeHelper)
- 数据权限注解:通过 @DataScope 声明数据范围级别(如全部、本部门、本人等)。
- 数据可见性上下文:DataVisibilityContext 维护当前请求的数据可见范围。
- 数据范围助手:DataScopeHelper 根据上下文与用户角色/部门生成 SQL 过滤条件。
- 使用建议:
- 在需要数据隔离的 Service 方法上添加 @DataScope
- 查询前确保上下文正确设置(通常由过滤器或拦截器完成)。
- 避免在复杂 SQL 中绕过数据范围。
```mermaid
flowchart TD
Start(["进入带@DataScope的方法"]) --> CheckCtx["检查数据可见性上下文"]
CheckCtx --> HasCtx{"上下文存在?"}
HasCtx --> |否| InitCtx["初始化默认数据范围"]
HasCtx --> |是| BuildCond["根据用户角色/部门构建SQL条件"]
InitCtx --> BuildCond
BuildCond --> Apply["应用到查询语句"]
Apply --> End(["返回受限结果集"])
```
图表来源
- [DataScope.java:1-200](file://crm-base/src/main/java/com/crm/base/annotation/DataScope.java#L1-L200)
- [DataScopeHelper.java:1-200](file://crm-base/src/main/java/com/crm/base/security/DataScopeHelper.java#L1-L200)
- [DataVisibilityContext.java:1-200](file://crm-base/src/main/java/com/crm/base/security/DataVisibilityContext.java#L1-L200)
章节来源
- [DataScope.java:1-200](file://crm-base/src/main/java/com/crm/base/annotation/DataScope.java#L1-L200)
- [DataScopeHelper.java:1-200](file://crm-base/src/main/java/com/crm/base/security/DataScopeHelper.java#L1-L200)
- [DataVisibilityContext.java:1-200](file://crm-base/src/main/java/com/crm/base/security/DataVisibilityContext.java#L1-L200)
### 控制器与服务层使用示例(路径引用)
- Controller 层:
- 获取当前用户:参考 [AuthController.java:1-200](file://crm-auth/src/main/java/com/crm/auth/controller/AuthController.java#L1-L200)
- 权限校验:参考 [SystemController.java:1-200](file://crm-auth/src/main/java/com/crm/auth/controller/SystemController.java#L1-L200)
- Service 层:
- 使用 SecurityUtils 获取用户并进行业务判断:参考 [PermissionServiceImpl.java:1-200](file://crm-auth/src/main/java/com/crm/auth/service/impl/PermissionServiceImpl.java#L1-L200)
- 数据范围控制:参考 [DataScopeHelper.java:1-200](file://crm-base/src/main/java/com/crm/base/security/DataScopeHelper.java#L1-L200)
章节来源
- [AuthController.java:1-200](file://crm-auth/src/main/java/com/crm/auth/controller/AuthController.java#L1-L200)
- [SystemController.java:1-200](file://crm-auth/src/main/java/com/crm/auth/controller/SystemController.java#L1-L200)
- [PermissionServiceImpl.java:1-200](file://crm-auth/src/main/java/com/crm/auth/service/impl/PermissionServiceImpl.java#L1-L200)
- [DataScopeHelper.java:1-200](file://crm-base/src/main/java/com/crm/base/security/DataScopeHelper.java#L1-L200)
### 实体与关系(用户、角色、部门、菜单)
- 实体关系概览:
- 用户与角色:多对多(通过关联表)。
- 用户与部门:多对多(通过关联表)。
- 角色与菜单:多对多(通过关联表)。
- ER 图(概念示意):
```mermaid
erDiagram
AUTH_USER {
uuid id PK
string username
string nickname
int status
timestamp created_at
timestamp updated_at
}
SYS_ROLE {
uuid id PK
string role_code
string role_name
int status
}
SYS_DEPT {
uuid id PK
string dept_name
int parent_id
int sort_order
}
SYS_MENU {
uuid id PK
string menu_code
string menu_name
int type
}
SYS_USER_ROLE {
uuid user_id FK
uuid role_id FK
}
SYS_USER_DEPT {
uuid user_id FK
uuid dept_id FK
}
SYS_ROLE_MENU {
uuid role_id FK
uuid menu_id FK
}
AUTH_USER ||--o{ SYS_USER_ROLE : "拥有"
SYS_ROLE ||--o{ SYS_USER_ROLE : "被拥有"
AUTH_USER ||--o{ SYS_USER_DEPT : "属于"
SYS_DEPT ||--o{ SYS_USER_DEPT : "包含"
SYS_ROLE ||--o{ SYS_ROLE_MENU : "配置"
SYS_MENU ||--o{ SYS_ROLE_MENU : "被配置"
```
图表来源
- [AuthUser.java:1-200](file://crm-auth/src/main/java/com/crm/auth/domain/entity/AuthUser.java#L1-L200)
- [SysRole.java:1-200](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysRole.java#L1-L200)
- [SysDept.java:1-200](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysDept.java#L1-L200)
- [SysMenu.java:1-200](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysMenu.java#L1-L200)
- [SysUserRole.java:1-200](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysUserRole.java#L1-L200)
- [SysUserDept.java:1-200](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysUserDept.java#L1-L200)
- [SysRoleMenu.java:1-200](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysRoleMenu.java#L1-L200)
章节来源
- [AuthUser.java:1-200](file://crm-auth/src/main/java/com/crm/auth/domain/entity/AuthUser.java#L1-L200)
- [SysRole.java:1-200](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysRole.java#L1-L200)
- [SysDept.java:1-200](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysDept.java#L1-L200)
- [SysMenu.java:1-200](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysMenu.java#L1-L200)
- [SysUserRole.java:1-200](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysUserRole.java#L1-L200)
- [SysUserDept.java:1-200](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysUserDept.java#L1-L200)
- [SysRoleMenu.java:1-200](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysRoleMenu.java#L1-L200)
## 依赖关系分析
- 模块间依赖:
- crm-auth 依赖 crm-base 的安全基础能力(LoginUser、SecurityUtils、数据范围)。
- 控制器依赖过滤器与令牌服务完成认证;业务层依赖 SecurityUtils 与数据范围工具。
- 运行时依赖:
- TokenService 依赖持久化存储(用户、角色、权限、部门)与缓存(可选)。
- 数据范围依赖 MyBatis/MyBatis-Plus 的动态 SQL 拼接。
```mermaid
graph LR
base["crm-base<br/>LoginUser/SecurityUtils/DataScope"] --> auth["crm-auth<br/>AuthLoginUser/TokenService/JwtFilter"]
auth --> controllers["Controllers"]
auth --> services["Services"]
services --> db["Database"]
```
图表来源
- [LoginUser.java:1-200](file://crm-base/src/main/java/com/crm/base/security/LoginUser.java#L1-L200)
- [SecurityUtils.java:1-200](file://crm-base/src/main/java/com/crm/base/security/SecurityUtils.java#L1-L200)
- [AuthLoginUser.java:1-200](file://crm-auth/src/main/java/com/crm/auth/security/AuthLoginUser.java#L1-L200)
- [TokenService.java:1-200](file://crm-auth/src/main/java/com/crm/auth/security/TokenService.java#L1-L200)
- [JwtAuthenticationFilter.java:1-200](file://crm-auth/src/main/java/com/crm/auth/security/JwtAuthenticationFilter.java#L1-L200)
章节来源
- [LoginUser.java:1-200](file://crm-base/src/main/java/com/crm/base/security/LoginUser.java#L1-L200)
- [SecurityUtils.java:1-200](file://crm-base/src/main/java/com/crm/base/security/SecurityUtils.java#L1-L200)
- [AuthLoginUser.java:1-200](file://crm-auth/src/main/java/com/crm/auth/security/AuthLoginUser.java#L1-L200)
- [TokenService.java:1-200](file://crm-auth/src/main/java/com/crm/auth/security/TokenService.java#L1-L200)
- [JwtAuthenticationFilter.java:1-200](file://crm-auth/src/main/java/com/crm/auth/security/JwtAuthenticationFilter.java#L1-L200)
## 性能考虑
- 用户信息缓存:
- 建议在 Redis 中缓存 LoginUser 及其角色/权限,减少频繁查库。
- 缓存键设计:user:{userId}:profile、role:{roleId}:perms、dept:{deptId}:info。
- 失效策略:用户信息变更时主动失效;设置合理过期时间(如 30 分钟)。
- 数据范围优化:
- 尽量使用索引字段(如 dept_id、owner_id)进行过滤。
- 避免在大数据集上使用复杂子查询,必要时物化视图或预聚合。
- 令牌校验:
- 本地签名校验优先,避免每次校验都落库。
- 黑名单机制需配合缓存(Redis)实现高效查找。
[本节为通用指导,不直接分析具体文件]
## 故障排查指南
- 常见安全问题与解决:
- 未登录或 Token 无效:检查 JwtAuthenticationFilter 与 TokenService 的解析逻辑与异常处理。
- 权限不足:确认用户角色与权限配置是否正确,检查 @DataScope 注解与数据范围上下文。
- 数据越权:核查数据范围 SQL 是否正确注入,避免绕过。
- 并发与一致性:用户信息更新后及时清理缓存,避免脏读。
- 定位步骤:
- 查看过滤器日志与异常堆栈。
- 打印 SecurityUtils 获取的 LoginUser 内容,确认上下文是否正确。
- 检查 Mapper 生成的 SQL 是否包含数据范围条件。
章节来源
- [JwtAuthenticationFilter.java:1-200](file://crm-auth/src/main/java/com/crm/auth/security/JwtAuthenticationFilter.java#L1-L200)
- [TokenService.java:1-200](file://crm-auth/src/main/java/com/crm/auth/security/TokenService.java#L1-L200)
- [DataScopeHelper.java:1-200](file://crm-base/src/main/java/com/crm/base/security/DataScopeHelper.java#L1-L200)
- [DataVisibilityContext.java:1-200](file://crm-base/src/main/java/com/crm/base/security/DataVisibilityContext.java#L1-L200)
## 结论
- LoginUser 是贯穿认证、鉴权与业务的核心载体,应保持稳定与最小暴露原则。
- SecurityUtils 提供统一入口,简化用户信息与权限判断的使用。
- 数据范围控制通过 @DataScope 与 DataScopeHelper 实现,确保行级数据安全。
- 合理的缓存策略与严格的异常处理是保障性能与安全的关键。
[本节为总结,不直接分析具体文件]
## 附录
- 常用路径参考:
- 获取当前用户:[SecurityUtils.java:1-200](file://crm-base/src/main/java/com/crm/base/security/SecurityUtils.java#L1-L200)
- 校验角色/权限:[SecurityUtils.java:1-200](file://crm-base/src/main/java/com/crm/base/security/SecurityUtils.java#L1-L200)
- 数据范围注解:[DataScope.java:1-200](file://crm-base/src/main/java/com/crm/base/annotation/DataScope.java#L1-L200)
- 数据范围助手:[DataScopeHelper.java:1-200](file://crm-base/src/main/java/com/crm/base/security/DataScopeHelper.java#L1-L200)
- 认证过滤器:[JwtAuthenticationFilter.java:1-200](file://crm-auth/src/main/java/com/crm/auth/security/JwtAuthenticationFilter.java#L1-L200)
- 令牌服务:[TokenService.java:1-200](file://crm-auth/src/main/java/com/crm/auth/security/TokenService.java#L1-L200)
- 控制器示例:[AuthController.java:1-200](file://crm-auth/src/main/java/com/crm/auth/controller/AuthController.java#L1-L200)、[SystemController.java:1-200](file://crm-auth/src/main/java/com/crm/auth/controller/SystemController.java#L1-L200)
- 权限服务:[PermissionServiceImpl.java:1-200](file://crm-auth/src/main/java/com/crm/auth/service/impl/PermissionServiceImpl.java#L1-L200)
[本节为附录,不直接分析具体文件]