我能发明的角色

2026年9月10日 admindevloggo

我能发明的角色

权限系统终于补上了我一直想要的最后一块。自从 RBAC 重构之后,站点就有了一个我可以编辑的能力矩阵:哪个角色能管理评论,哪个角色能看到用户列表,全部都可以开关。但角色本身却是刻在石头上的:user、moderator、dev、admin,爱要不要。想要一个“junior moderator”?没门,自己写代码去吧。

权限页面上的角色阶梯。user 和 admin 固定不动。

权限页面上的角色阶梯。user 和 admin 固定不动。

现在角色只是数据。权限页面把它们显示成一条阶梯,user 固定在最底部,admin 固定在最顶部,我可以在中间任意位置新建角色,给它改名,上下移动它的位置,或者删除它。阶梯上的位置就是等级,而等级决定了谁能对谁动手,所以把一个角色拖到 moderator 上方,实际意思就是 moderator 再也动不了这个角色的持有者了。一个新角色一开始权限是零,要等我手动打开一些开关才有权限,这感觉是唯一说得通的默认设置。

我真正花心思的地方是删除。删除一个有人持有的角色时,系统会让我确认,并准确告诉我有多少人持有它,然后把这些人全部退回到普通的 user。那这些人手里还揣着的令牌呢?一个指向已经不存在的角色的会话令牌,什么权限都拿不到,整个系统把未知角色当作等级为零、没有任何权限来处理。我专门测试了这种情况:建一个角色,给某人发一个带这个角色的令牌,删掉角色,重放这个令牌,结果是 403。这就是那种无聊却能让我安心睡觉的测试。

整条"默认拒绝"规则装进一个函数就够了:

func (c *Cache) RankOf(ctx context.Context, name string) (int, error) {
	list, err := c.List(ctx)
	if err != nil {
		return 0, err
	}
	for i, r := range list {
		if r.Name == name {
			return i, nil
		}
	}
	return 0, nil // unknown role: bottom of the ladder, no privileges
}

顺手还修了一个小地方:以前那条“只有更高等级的角色才能编辑用户名和邮箱”的规则,检查的是那个字面上叫作“dev”的角色。既然 dev 现在也可以被改名,这项检查就改成比较阶梯上的位置,而不是比较名字。现在名字只是标签,阶梯才是真相。

0 条评论

登录 后即可评论。

登录

忘记密码?

还没有账号?