做开源项目有时候最难的,不是增加一个功能。
而是你做到某个阶段以后,突然意识到:
原来的架构,已经装不下你真正想做的东西了。
AuthX 就经历了这样一个阶段。
最开始,我们希望它能够解决最常见的用户、角色、菜单、按钮、API 权限问题。
但随着功能不断增加,我们开始越来越频繁地面对一些问题:
这些问题已经远远超过了一个简单的后台管理系统。
所以,我们决定做一件更彻底的事情:
重新开始。
AuthX 正式更名为 GrantForge
项目现在正式从 AuthX 更名为:
GrantForge
这个名字由两个词组成:
Grant + Forge
Grant 是授权。
Forge 是锻造。
我们希望它表达的是:
Forge Your Access.
权限不应该只是数据库里几张 user_role、role_permission 表。
真正成熟的权限系统,需要把身份、资源、角色、策略、数据、审计、授权决策以及外部系统连接起来。
这也是 GrantForge 接下来希望解决的问题。
因此,这次不仅仅是一次 Rename。
我们几乎把整个项目重新做了一遍。
一、后端重新开始:Spring Boot 4.1
旧版本后端已经被替换。
新的 GrantForge 后端重新基于 Spring Boot 4.1 构建。
这次重构没有简单地把原来的代码搬过去,而是重新建立整个项目的工程基础。
包括:
-
Spring Boot 4.1
-
Hibernate
-
Liquibase
-
OpenAPI
-
RFC 9457 Problem Details
-
Request ID
-
TSID 主键
-
乐观锁
-
多租户数据隔离
-
国际化
-
Prometheus Metrics
-
Health Probe
数据库 Schema 也重新进行了可移植性设计。
目前针对:
-
PostgreSQL
-
MySQL
-
MariaDB
-
Oracle
-
SQL Server
进行了兼容处理。
数据库升级则统一通过 Liquibase 管理。
换句话说,我们不再把 GrantForge 当成一个“能跑起来的后台项目”。
而是开始按照一个长期维护的基础设施项目去建设它。
二、前端也重新做了一遍
后端重写以后,旧 Console 同样没有继续保留。
新的管理端重新使用:
Vue 3 + Tailwind CSS
构建。
同时移除了浏览器原生控件,重新建立了一套统一的主题组件。
新的 Console 支持中英文界面,并根据当前登录用户真正拥有的权限动态展示页面和操作。
这里有一个我们非常在意的原则:
看不到,不代表没有权限;后端拒绝,才是真的没有权限。
所以 GrantForge 的权限控制并不只存在于前端。
页面、按钮和 API 都拥有自己的权限定义。
服务器启动时会自动注册 API Endpoint 与对应权限,Console 也维护自己的 Permission Manifest。
CI 会进一步检查:
API、Console 与权限清单是否一致。
这样可以减少非常常见的一类问题:
前端隐藏了按钮,但接口其实谁都能调。
三、重新构建 RBAC
GrantForge 的基础仍然是 RBAC。
但是我们希望把 RBAC 做得更加完整。
现在系统已经围绕:
User → Role → Permission
建立了完整的授权体系。
角色可以授予:
一个用户最终的 Effective Permission,则由所有角色共同计算得到。
权限覆盖:
同时支持:
角色继承
角色之间可以建立继承关系。
比如:
普通员工
↓
部门管理员
↓
平台管理员
上层角色可以继承下层角色已经拥有的能力。
这可以明显减少大型组织中的重复授权。
四、权限不再停留在「菜单和按钮」
这是这次 GrantForge 重构中,我个人非常重视的一部分。
很多所谓的 RBAC 系统做到最后,解决的其实只有:
这个按钮能不能点。
但真实业务里,最复杂的问题通常不是按钮。
而是:
点击按钮以后,他到底能看到什么数据?
所以 GrantForge 开始加入真正的数据权限体系。
数据行级权限
现在角色可以配置数据策略。
应用中的实体可以声明自己受到 Data Permission 管理。
GrantForge 根据当前用户的权限条件,对数据进行过滤。
例如:
销售人员:
只能查看自己负责的客户
部门负责人:
可以查看自己部门的数据
区域管理员:
region = EAST
平台管理员:
ALL
最终,同一个 API:
GET /customers
不同用户调用后看到的数据可以完全不同。
这也是我们希望实现的:
Row-Level Security。
五、字段级权限
有些情况下,控制“哪一行能看”仍然不够。
例如员工信息:
{
"name": "张三",
"phone": "138",
"salary": 30000
}
普通员工也许可以看到姓名。
HR 可以看到手机号。
但是工资字段只有特定角色才能查看。
GrantForge 因此进一步加入了:
Field-Level Permission
字段策略可以决定:
-
Visible
-
Hidden
-
Masked
-
Read Only
例如:
salary → Hidden
phone → Masked
email → Visible
而且不仅影响查询结果。
对于只读保护字段,服务器也会拒绝非法修改。
六、告诉你「为什么有这个权限」
权限系统发展到一定规模以后,会出现一个非常现实的问题:
这个用户为什么有这个权限?
比如某个员工突然拥有:
customer.delete
到底来自:
如果只能看到最终结果,排查权限问题会非常痛苦。
所以 GrantForge 增加了:
Effective Permission Explain
除了告诉你:
ALLOW
还希望能够解释:
WHY ALLOW
管理员可以查看一个用户最终拥有哪些权限,以及这些权限是如何得到的。
这对于复杂组织中的权限排查非常重要。
七、修改权限之前,先看看会发生什么
权限属于高风险配置。
所以有些修改不能简单地:
点保存 → 生效 → 出问题再回滚。
GrantForge 增加了权限模拟能力。
你可以在真正修改之前查看:
What If?
例如:
如果给 Alice 增加 FinanceAdmin 角色会怎样?
系统可以模拟 Alice:
新增哪些权限。
失去哪些权限。
哪些资源将受到影响。
然后管理员再决定是否真正执行。
八、临时权限申请
现实中的权限并不总是永久的。
例如:
某个开发人员需要临时查看生产环境日志。
财务人员月底临时需要高级权限。
运维工程师需要临时进入某个系统排查问题。
传统系统通常只有一个办法:
管理员手动加角色
↓
使用完成
↓
希望管理员还记得删
于是 GrantForge 开始支持:
Role Request
用户可以申请角色。
审批人审核后,可以只授予一段时间。
例如:
ProductionViewer
有效时间:
2026-10-05 10:00
↓
2026-10-05 18:00
时间结束以后,权限自动失效。
九、职责分离:有些角色不能同时拥有
企业权限系统中还有一个很重要的问题:
Separation of Duties
职责分离。
例如:
付款申请人
和:
付款审批人
理论上不应该是同一个人。
GrantForge 因此加入了角色冲突约束。
可以定义:
Role A
✕
Role B
禁止同一个账号同时持有两个互斥角色。
相比单纯 RBAC,这开始更接近真实企业权限治理场景。
十、加入 Access Review
权限系统运行时间越长,权限只会越来越多。
员工换部门。
岗位变化。
项目结束。
临时权限忘记回收。
最终很容易出现:
Permission Creep
权限膨胀。
所以 GrantForge 增加了周期性:
Access Review
管理员可以重新检查:
谁还拥有这些角色?
以及:
这些授权现在是否仍然合理?
这也是权限治理中非常重要的一部分。
十一、登录能力开始完整起来
GrantForge 同样重新建设了身份认证体系。
除了本地账号,现在已经加入:
OpenID Connect
可以通过 OIDC Provider 登录。
LDAP
可以连接企业 LDAP Directory。
Two-Factor Authentication
支持基于 Authenticator App 的二步验证。
同时 Console Session 改成数据库 Session 管理。
管理员可以查看并结束登录 Session。
登录历史也会记录到审计系统。
十二、Audit Log
任何权限平台最终都绕不开:
审计。
GrantForge 会记录权限变化,并保持 Audit Log 的追加式存储。
管理员可以搜索和导出审计日志。
这样以后遇到:
谁改了这个权限?
什么时候改的?
之前是什么?
这类问题时,不需要再去服务器翻日志。
十三、GrantForge 不只是给自己用
这是整个项目非常重要的一次方向变化。
以前 AuthX 更像:
一套带权限能力的后台管理系统。
现在 GrantForge 希望逐渐变成:
可以为其他应用提供授权能力的基础设施。
所以我们开始增加应用集成能力。
Spring Boot Starter
Java / Spring Boot 应用可以通过 Starter 接入 GrantForge。
应用可以询问:
这个用户能不能执行这个操作?
例如:
grantForge.can(
user,
"order",
"delete"
);
JavaScript Client
同时提供 JavaScript Client。
Vue 应用可以通过 Directive 控制界面能力。
例如:
<button v-permission="'user.delete'">
删除用户
</button>
OAuth / OpenID Connect
应用可以注册 OAuth Client。
用户可以通过 GrantForge 登录应用。
这样 GrantForge 开始同时承担:
Authentication + Authorization
两部分能力。
十四、授权决策开始独立出来
除了传统 RBAC,GrantForge 还开始构建更加独立的授权决策能力。
应用可以直接询问:
Alice 能不能读取 Resource X?
系统返回:
ALLOW
或者:
DENY
同时可以进一步解释:
为什么。
这意味着以后业务系统不一定需要自己实现复杂权限逻辑。
授权决策可以逐渐交给 GrantForge。
十五、开始进入数据基础设施权限
这次更新里还有一个非常重要、但可能不是所有人第一眼都会注意到的方向:
Service Plugin + Agent
GrantForge 定义了 Service Type Plugin API。
不同的数据基础设施可以通过插件接入。
每个 Plugin 运行在自己的 ClassLoader 中。
系统负责:
-
注册服务
-
保存服务凭据
-
管理 Policy
-
下发 Policy Snapshot
-
Agent 执行授权
-
收集授权决策
第一个 Service Plugin:HDFS
GrantForge 已经加入 HDFS Service Type Plugin。
同时增加了 Hadoop NameNode Agent。
Agent 可以获得签名后的 Policy Snapshot。
然后对访问请求执行授权判断。
默认策略采用:
Default Deny
也就是说:
没有明确允许,就拒绝。
这套设计和普通 Web 后台中的 RBAC 已经有明显区别。
它开始尝试解决:
数据基础设施中的统一权限治理问题。
十六、插件化意味着什么?
我们不希望把所有系统的逻辑全部写死在 GrantForge Core 中。
未来不同的数据系统,都可以有自己的 Service Plugin。
例如理论上可以继续扩展:
HDFS
Hive
Kafka
Iceberg
Object Storage
Database
……
GrantForge Core 负责:
Identity
Policy
Authorization
Audit
具体服务 Plugin 负责理解:
Resource
Action
Service
Agent 则负责:
Enforcement
这会让整个架构更容易扩展。
十七、百万账户规模测试
权限系统在数据量很小的时候,几乎什么实现都能跑。
真正的问题是:
10 个用户
和:
1,000,000 个用户
完全不是同一个问题。
因此我们也开始针对:
百万账户规模
对 Authorization 和 List API 进行 Benchmark。
同时围绕权限计算做了一些优化:
权限缓存会一直保留,直到它依赖的数据发生变化。
目标是尽量避免每一个请求都重新计算整棵权限关系。
十八、完整的工程质量体系
这次重构还有大量工作其实用户根本看不到。
但我认为它们对于一个长期维护的开源项目同样重要。
GrantForge 现在在 CI 中加入了大量自动化检查。
包括:
Checkstyle
PMD
SpotBugs
ArchUnit
JaCoCo
ShellCheck
CodeQL
Dependency Review
Secret Scan
CycloneDX SBOM
License Check
Commit Message Check
同时要求:
每个 Source File 都存在对应 Unit Test File。
并对每个模块设置:
Line Coverage
Branch Coverage
质量门禁。
十九、多数据库测试
支持多个数据库写在 README 里很容易。
真正困难的是:
每个版本都保证它真的还能运行。
因此 GrantForge 建立了共享的 Multi-Database Test Harness。
持久层会针对不同数据库执行测试。
包括:
-
PostgreSQL
-
MySQL
-
MariaDB
-
Oracle
-
SQL Server
Liquibase Changelog 也增加了 CI 检查。
避免加入只在某一种数据库中有效的 Column Type。
二十、完整的 E2E 测试
除了单元测试以外,GrantForge 也开始构建完整的 Full Stack Acceptance Test。
测试直接针对打包后的 Server 运行。
Web 端进一步覆盖:
-
View
-
Router Guard
-
Auth Store
-
Bootstrap
-
Shared Components
-
Toast
-
Formatter
这意味着测试对象不再只是某几个核心 Service。
而是在逐渐覆盖真正交付给用户的整个系统。
二十一、部署方式也完整起来了
GrantForge 现在开始提供多种部署方式。
包括:
Docker
Docker Compose
Helm
Release 也可以通过版本 Tag 自动发布。
Maven Artifact 同样加入 Release Pipeline。
对于 Java 开发者来说,后续可以更加方便地直接集成 GrantForge 的 SDK / Starter,而不需要从源码构建。
二十二、文档站也重新做了
项目文档站重新使用:
Next.js + Tailwind CSS
构建。
README 也重新整理为英文版和中文版。
项目名称、仓库链接、Logo、Brand 等内容,都已经开始统一迁移到 GrantForge。
对我来说,这也是一个比较重要的信号:
GrantForge 不再只是 AuthX 换了一个名字。
我们正在重新定义这个项目到底是什么。
为什么要做这么多?
有人可能会问:
现在已经有很多:
IAM
RBAC
SSO
OAuth
Policy Engine
开源项目。
为什么还要继续做 GrantForge?
这个问题其实我自己也想过很多次。
后来我的答案变得越来越简单:
因为我自己需要这样一套东西。
在开发不同产品的时候,我反复遇到:
用户管理再写一次
角色管理再写一次
菜单权限再写一次
按钮权限再写一次
API 权限再写一次
数据权限再写一次
OAuth 再接一次
审计再做一次
每一个项目都在重复。
而当系统越来越复杂以后,又开始需要:
LDAP
OIDC
2FA
Field Permission
Row Permission
Access Review
Temporary Grant
Policy Explain
Audit
再往数据平台走,还会遇到:
HDFS
Hive
Kafka
Database
Object Storage
的授权问题。
所以我希望最终能有一个东西:
应用负责业务,GrantForge 负责权限。
这就是现在 GrantForge 想走的方向。
GrantForge 还远没有完成
这次重构做了很多事情。
但是我仍然不认为 GrantForge 已经“完成”。
恰恰相反。
现在可能只是刚刚建立好了真正的地基。
接下来还有大量问题值得继续研究。
例如:
更复杂的 Policy Model
更完整的 ABAC
Service Plugin
Agent
Policy Distribution
Authorization Performance
Multi-Region
High Availability
更多数据基础设施集成
以及如何让这些复杂能力保持:
足够简单。
这是我认为最难的一件事情。
最后
从 AuthX 到 GrantForge,对我来说并不是一次普通的版本升级。
它更像是一次重新开始。
我们把旧后端替换掉了。
把前端重新做了。
把权限模型重新梳理了。
把数据权限、字段权限、审计、权限解释、临时授权、职责分离、OIDC、LDAP、2FA、Plugin、Agent、HDFS 等能力一点一点重新搭起来。
然后重新思考:
一个真正可以长期使用的开源权限平台,到底应该是什么样子?
现在我还没有最终答案。
但至少 GrantForge 已经开始朝这个方向走了。
如果你也正在做:
-
SaaS
-
企业后台
-
数据平台
-
微服务
-
权限中心
-
IAM
-
统一认证
-
数据权限
或者你也曾经被复杂的 RBAC、数据权限和授权逻辑折磨过。
欢迎关注 GrantForge。
也欢迎参与项目,一起把它继续做下去。
GrantForge
Forge Your Access.
让应用专注业务。
把授权交给 GrantForge。