别只做登录页:用 IAM 把 OIDC、RBAC 和审计串起来

0 阅读3分钟

内部系统做多以后,最容易被低估的是账号体系。

每个系统自己维护用户表,短期看开发快;长期看会变成权限治理问题:账号分散,角色重复,离职回收靠人工,出了越权问题也很难还原授权链路。

IAM 的本质不是登录页,而是身份控制层。

MLiev IAM 仓库:cnb.cool/mliev/iam/m…

这个项目适合怎么看

MLiev IAM 是一个 Go 项目,技术栈包括 Gin、GORM、Redis、Viper、Zap、JWT、OAuth2.0/OIDC 和 Docker。它的重点不是单个登录接口,而是把这些东西连起来:

  • 用户身份
  • 组织部门
  • 业务应用
  • OIDC 登录
  • RBAC 权限
  • 数据范围
  • 审计和运维入口

这正好覆盖了企业内部认证中心的核心路径。

先跑服务

git clone https://cnb.cool/mliev/iam/mliev-iam
cd mliev-iam
cp config.yaml.example config.yaml
go mod download
go run main.go

第一轮验证看这几个端点:

GET /health
GET /health/simple
GET /api/admin/system/info

如果服务、数据库、Redis 和配置都正常,再进入应用接入。

应用接入用 OIDC 做主线

仓库当前的管理路径是:

/api/admin/applications

这比单纯的 OIDC Client 更合理,因为业务系统在 IAM 中应该被当作“应用”管理。

OIDC 公开端点:

/.well-known/openid-configuration
/api/oidc/authorize
/api/oidc/token
/api/oidc/userinfo
/api/oidc/introspect
/api/oidc/revoke
/api/oidc/jwks

接入一个后台系统时,优先跑通授权码流程:

业务系统 -> IAM authorize -> 登录/授权 -> 回调 code -> token -> userinfo -> 业务会话

这条链路跑通,业务系统就不用自己持有一整套登录逻辑。

RBAC 不要只做“管理员/普通用户”

MLiev IAM 的 RBAC 可以按这条关系理解:

User -> UserRole -> Role -> RolePermission -> Permission

实际使用时,建议把权限拆成三层。

第一层是角色。比如系统管理员、部门管理员、审计员、普通成员。

第二层是权限资源。比如菜单、按钮、API、数据动作。

第三层是数据范围。比如全部、本部门、本部门及下级、仅本人。

很多后台系统的风险,不是登录没做,而是登录以后权限过大。RBAC 真正要解决的是这个问题。

部门树负责组织边界

企业系统里,权限经常和组织关系绑定。MLiev IAM 的部门接口支持部门 CRUD、部门树、根部门、子部门、后代部门、部门移动、状态变更和层级校验。

简单说,部门树让权限有了组织上下文:

公司 -> 事业部 -> 部门 -> 团队

当角色和部门数据范围结合起来,权限就能从“这个人能不能访问”进一步细化到“这个人能访问哪个组织范围内的数据”。

审计是 IAM 的最后一环

认证中心不能只负责发令牌,还要能回答问题。

需要记录的动作包括:登录成功与失败、账号禁用、应用配置变更、回调地址调整、角色授权、用户角色绑定、部门移动、令牌撤销、配置重载。

这样出现问题时,团队能回到一条完整链路:身份、应用、权限、数据范围、动作记录。

落地顺序

我的建议是:

  1. 先跑通 MLiev IAM 服务。
  2. 接一个低风险内部应用。
  3. 用 OIDC 授权码流程完成统一登录。
  4. 建基础角色和部门树。
  5. 拆菜单、按钮、API 和数据权限。
  6. 把授权和应用配置变更纳入审计。

这比直接写一个登录页慢一点,但后续每多接一个系统,收益都会更明显。