安全与 RBAC
StackRivet 的访问控制默认拒绝:受保护端点除非有权限显式放行,否则一律拒绝。生成的模块带着权限注解发布,所以新模块默认就是锁住的,而不是不小心敞开。
- Spring Security + 可撤销的 Token。 登录时服务端校验凭证、加载用户的角色与权限、签发 token;token 可撤销(如强制下线)。
- 登录日志记录每次成功与失败(含失败原因);内置登录失败锁定。
- 密码以强 hash 存储——绝不明文。密码、token、密钥绝不进日志。
sequenceDiagram actor 用户 participant Web participant API as Auth API participant Sec as Security participant DB as 数据库 用户->>Web: 输入账号 + 密码 Web->>API: POST /api/v1/auth/login API->>Sec: 校验凭证 Sec->>DB: 加载用户、角色、权限 DB-->>Sec: 权限上下文 Sec-->>API: 签发 token API-->>Web: token、用户信息、菜单 Web->>API: 受保护请求(Bearer token) API->>Sec: 认证 + 授权 Sec-->>API: 放行或拒绝(401 / 403)
授权在五个不同层面强制——单靠 UI 隐藏从来不是控制手段:
| 层 | 控制 | 强制点 |
|---|---|---|
| 菜单 | 用户看到哪些导航 | 服务端下发的菜单树 |
| 按钮 | 哪些 UI 操作可用 | 权限指令 / 组件 |
| API | 用户可调用哪些服务端端点 | @PreAuthorize 式注解 + URL matcher |
| 数据 | 查询能返回哪些行 | 查询拦截器(见下) |
| 资产 | 私有文件的访问 | 签发 signed URL 前做权限校验 |
默认响应:未认证 401,未授权 403。
RBAC 模型
Section titled “RBAC 模型”Community 版即内置标准的企业组织模型:
- 用户、角色、部门、岗位。
- 带菜单、按钮、API 权限的菜单挂在角色上。
角色聚合权限;用户被分配角色(及部门/岗位),有效权限集在登录时解析。
数据权限在服务端强制
Section titled “数据权限在服务端强制”行级数据范围不是前端的便利功能——它在持久化层强制。
- Community 版通过
DataPermissionInterceptor强制 本人 / 部门 / 部门及以下 / 全部 四种范围,把范围条件注入查询。它不是前端隐藏。 - 该机制通过
DataScopeTableContributorSPI 可扩展。机制随 Community 一起落地;自定义数据权限策略在 Pro / Enterprise 启用(“机制前置、按版解锁”思路)。
这一点很重要,因为最常见的访问控制 bug——“行在 UI 里被隐藏了,但 API 还是把它返回了”——在结构上被杜绝。
- 任何地方都不存明文密码。
- 任何日志行都不含密码、token、密钥。
- 私有文件在签发 signed URL 之前必须做权限校验——signed URL 绝不无条件发放。
本文档所述的 Community 版包含:账号密码登录、JWT/token 管理、登录日志与锁定、基础密码策略、会话管理、强制下线、完整 RBAC,以及基础数据权限范围。
企业级认证能力——MFA、OIDC、SAML、LDAP/AD、企业 SSO(企业微信 / 钉钉 / 飞书)与单点登出——不在 Community 内;详见价格页。架构为它们留了干净的扩展点。