1
回答
thinkphp的auth权限认证疑问
【腾讯云】校园拼团福利,1核2G服务器10元/月!>>>   

ThinkPHP提供一个内置的Auth.class.php类来实现权限控制,这个类提供三个表:

1.think_auth_rule                 (认证规则表)
2.think_auth_group            (用户组表)
3.Think_auth_group_access_        (用户组对应关系表)


而我一般是限制用户可以访问的控制器, 我只需给用户表增加1个字段,这个字段用户保存用户属于哪个用户组。然后通过查找用户的用户组id去遍历规则表是否存在当前的方法就行了,

为什么还要1个Think_auth_group_access_

当然我们可以抛开TP来将这个事情

<无标签>
举报
陕西小七
发帖于1年前 1回/165阅
共有1个答案 最后回答: 1年前

我觉得这个其实就是ThinkPHP自己提供RBAC权限管理机制.
用户组group其实就是RBAC里的角色role.
规则rule其实就是RBAC里的权限permission.

RBAC中无非描绘的就是下面几个实体的关系:
用户 <=> 角色 <=> 权限

因为我们的查询方向一般都是:
用户 => 角色(用户组) => 权限(规则)

所以完全可以在用户表里添加一个角色编号字段,用于记录用户所属的角色编号,多个角色可以用逗号分隔后存储,这样就可以省去一张用户跟角色的对应关系表.

同理,角色表里也可以添加一个权限编号字段,用于记录角色所有的权限编号,多个权限可以用逗号分隔后存储,这样就可以省去一张角色跟权限的对应关系表,ThinkPHP的Auth.class.php也是这么做的.

但是这么做反查的时候就不太方便了:
用户 <= 角色(用户组) <= 权限(规则)
要反查的话,MySQL中数据量不大时可以用FIND_IN_SET:
在用户表中查包含角色编号1000的用户记录:
WHERE FIND_IN_SET('1000', `角色编号集合字段`)
在角色表中查包含权限编号1000的角色记录:
WHERE FIND_IN_SET('1000', `权限编号集合字段`)
在数据量大时,可以考虑为编号集合字段创建全文索引,然后用全文检索来查:
WHERE MATCH(`角色编号集合字段`) AGAINST('+1000' IN BOOLEAN MODE)
WHERE MATCH(`权限编号集合字段`) AGAINST('+1000' IN BOOLEAN MODE)

相比RBAC,ThinkPHP的rule表特别之处在于还多了一个condition字段,用于定义附加条件,比如该字段内容为{score}>100 and {score}<200的话,就表示该用户组的用户,用户表的score积分字段必须在100到200范围内,才具备该规则的操作权限.在RBAC中增加这个功能也不难,是我的话,就是在权限表中增加一个condition字段,内容是JSON或者PHP序列化serialize后的格式,如:
{"score":{"min":100,"max":200}}
条件判断时解码就能拿到一个PHP数组:
array(
    'score' => array(
        'min' => 100,
        'max' => 200
    )
)

--- 共有 2 条评论 ---
eechen回复 @七dsadas : 我也是在做自己的后台,虽然我不用框架,但也查了一些框架相关的资料.ThinkPHP的有 http://www.thinkphp.cn/topic/4029.html 和 http://baijunyao.com/article/67 文章. 1年前 回复
陕西小七非常感谢大神您的帮助,让我茅塞顿开。 1年前 回复
顶部