2017-06-24 09:55:32 2631次浏览 6条回答 1 悬赏 10 金钱

因为以前用的TP,现在用YIi ,发现他们在实现RBAC的时候大致原理是差不多的,但是在数据库结构上有点小小的区别,

父子权限与子权限TP用的是以ID关联:如:

parent   child
1          0
1          2 

而YII中他是直接用的name去关联
一般我在name字段都是存储的节点的形式,如:modules/controll/action

个人觉得用ID:这样管理的方便,一是存储数据少了,只是数字而已,对查询的SQL语句也会精简一些

如果用name:那将会存储很多很长的字符串

所以不知道YII这样做的初终是什么, 这样做有什么特别的好处吗?
因为个人觉得还是ID好,所以想将的的数据结构上扩展一下加一个Id字段,这样用ID去关联,可能RBAC的源码要进行修改才行!

有大神能讲讲他的利弊吗?给点建议有好!谢谢!

  • 回答于 2017-06-24 10:04 举报

    反正不要我去查询,底层怎么实现的就不太关心了。

    2 条回复
    回复于 2017-06-24 10:15 回复

    在做项目的时候不可能就用他原原本本的就能满足客户的一些需求,可以在他的源结构中扩展加一些字段,或者是新建一张表来关联他的权限表,这都是很有可能的;而且有时候单用他原有的查询可能也满足不了需要的结果

    在做过中大小项目的人应该能体会得到

    回复于 2017-06-24 10:21 回复

    从SQL语句也能发现:

    如:我有50个权限要检查

    YIi会这样去查:
    SELECT * FROM data00200 where name IN ('home/default/index', 'home/list/index', 'home/user/index', 'home/welcome/index', 'login/default/index'.......)后面跟上50个节点
    这个SQL语句无比的长

    如果是ID

    SELECT * FROM data00200 where name IN (1,2,3,4,5,7,8,9,10)
    很明显 ID简洁

  • 回答于 2017-06-24 10:46 举报

    确实没用yii做过大项目。
    现在小项目,在需要判断用户权限时,直接让yii自己判断

        if(yii::$app->user->can('/ping/*') || yii::$app->user->can('/*')){
            ……
        }
    
    1 条回复
    回复于 2017-06-24 10:50 回复

    准确的说,应该是没做过多用户太多、对权限要求很多的项目。

  • 回答于 2017-06-24 10:55 举报

    这很好理解啊,id虽然精简但是你能通过id推测出是控制什么的吗?
    语义化的权限本身通过分隔符体现了权限层级,设计优良的权限体系可以很快区分出需要哪些权限

    1 条回复
    回复于 2017-06-24 15:31 回复

    语义化的话那你这样说的话似乎也是挺合理的, 确实可以体现出来

  • 回答于 2017-06-24 15:42 举报

    12475

    3 条回复
    回复于 2017-06-24 15:42 回复

    4785785

    回复于 2017-06-24 15:42 回复

    关联而不用ID来关联

    回复于 2017-06-26 10:43 回复

    什么意思?

  • 回答于 2017-06-25 07:17 举报
    • 一般我在name字段都是存储的节点的形式,如:modules/controll/action

      Yii2 RBAC 表格内不是用来存储路由(route, 即你说的“节点”)的。路由的权限判断通过 ACF (Access Control Filter) 实现。

    • 在做项目的时候不可能就用他原原本本的就能满足客户的一些需求,可以在他的源结构中扩展加一些字段……

      你说的有道理,前提是你对 Yii2 RBAC 相关知识通读过,有一个整体的、大致的认识。当自己的需求不能实现时,大致有两种可能:一、某个知识点能解决需求,但是该知识点自己不知道;二、需求比较特殊,框架中提供的通用功能满足不了特殊的需求。解决办法是新建一个子类,在子类中进行个性化定制。

    • 如:我有50个权限要检查 YIi会这样去查:SELECT * FROM data00200 ***

      你确定 Yii2 是这样查找的吗?还是 ThinkPHP 是这么查的,所以你觉得 Yii2 也是这么做的?我对 RBAC 了解有限,没有找到这里的出处。

    我觉得你走进了一个误区:有意无意地,带着 ThinkPHP 已有的知识结构去理解 Yii2. 框架间的实现原理的确类似,数据结构也可能差别不大,但是实现思路上可能存在差别。

    4 条回复
    回复于 2017-06-26 10:47 回复

    哦哦,谢谢!我确实也没有仔细去通读!也有比较特殊的个性化定制!我在去好好硬实一下吧。

    回复于 2017-06-29 08:15 回复

    你去看看 Yii::$app->authManager->getPermissionsByUser

    回复于 2017-06-29 08:16 回复

    它确实就是这么干的

    $query = (new Query)->from($this->itemTable)->where([

            'type' => Item::TYPE_PERMISSION,
            'name' => array_keys($result),
        ]);
    
    回复于 2017-06-29 08:50 回复

    我看了那段代码,的确如你所说。

    你之前举的例子是把 50 个节点(路由)存入数据库,对于我这个不了解 ThinkPHP, 只了解些 Yii2 的人看来,这种做法不好理解,因为使用 Yii::$app->user->can() 时,参数使用的是角色/权限名称而不是路由名称。使用 Access Control Filter 可以把若干个节点组合在一起,赋予对应的权限,这样可以达到用一个权限控制多个节点的效果。

  • 回答于 2017-06-26 10:45 举报

    yii不是用yii::$app->user->can()来做权限验证了吗?干嘛还要自己写权限验证

    1 条回复
    回复于 2017-06-26 10:48 回复

    验证,当然也是用他自带的验证方法!只有有一些个性化的需要而已!

您需要登录后才可以回答。登录 | 立即注册
xjcallen
见习主管

xjcallen 东莞

注册时间:2017-01-10
最后登录:2022-06-30
在线时长:6小时36分
  • 粉丝0
  • 金钱175
  • 威望0
  • 积分235

热门问题