【问题标题】:Most efficient/easy method for permission system?权限系统最有效/最简单的方法?
【发布时间】:2014-01-21 22:43:19
【问题描述】:

我正在使用 CakePHP 创建一个应用程序,但在尝试找出应用程序的权限系统时遇到了心理障碍。我已将其缩小为几种不同的方法,并且我正在寻找一些信息,说明哪种方法最容易实现和 b) 最有效(显然这两者之间可以进行权衡)。

该应用程序有许多不同的模型,但为简化起见,我将仅使用 User、Department 和 Event。我希望能够在每个模型上单独控制每个用户的 CRUD 权限。

Cake ACL

虽然记录不充分,但我对 ACL 系统的工作原理有了一定的了解,并考虑按如下方式创建 ARO:

[1]user
    create
    read
    update
    delete
[2]department
    ...

等等。这需要用户在许多个不同的组中,而据我所见,Cake 并不容易支持这一点。是否有更好的方法可以做到这一点,或者 ACL 不适合这种情况?

数据库中的权限标志

这个非常简单,显然在用户记录中有一个标志 create_users、read_users 等。对于 4-5 个模型,这意味着 16-20 个权限字段,这让我考虑使用位掩码或使用连接表。其中一个比另一个更好吗?哪一个更快且开销更少?

总的来说,我想我真的很想知道从效率和易于开发的角度来看,哪种方法在应用程序的规模上最有意义。如果您有过去项目的经验,我也愿意接受有关如何解决此问题的其他建议。提前致谢!

【问题讨论】:

    标签: mysql database-design bit-manipulation cakephp-2.3


    【解决方案1】:

    这通常是我设置权限的方式——你有actions可以执行,roles可以执行那些actions和users有roles。我在此处提供的示例基于您的要求,但我认为您会发现很少有用户只能“创建新用户记录”或“更新部门记录”。

    actions
        id              varchar(50)
        description     varchar(200)
    
    +-------------------+----------------------------------------------+
    |    id             | description                                  |
    +-------------------+----------------------------------------------+
    | USER_CREATE       | Allow the user to create USERS records.      |
    | USER_DELETE       | Allow the user to delete USERS records.      |
    | USER_READ         | Allow the user to read USERS records.        |
    | USER_UPDATE       | Allow the user to update USERS records.      |
    | DEPARTMENT_CREATE | Allow the user to create DEPARTMENT records. |
    | ................. | ............................................ |
    +-------------------+----------------------------------------------+
    
    roles
        id              unsigned int(P)
        description     varchar(50)
    
    +----+--------------------+
    | id | description        |
    +----+--------------------+
    |  1 | Manage users       |
    |  2 | Manage departments |
    | .. | .................. |
    +----+--------------------+
    
    roles_actions
        id              unsigned int(P)
        role_id         unsigned int(F roles.id)
        action_id       varchar(50)(F actions.id)
    
    +----+---------+-------------------+
    | id | role_id | action_id         |
    +----+---------+-------------------+
    |  1 |       1 | USER_CREATE       |
    |  2 |       1 | USER_DELETE       |
    |  3 |       1 | USER_READ         |
    |  4 |       1 | USER_UPDATE       |
    |  5 |       2 | DEPARTMENT_CREATE |
    |  6 |       2 | DEPARTMENT_DELETE |
    | .. | ....... | ................. |
    +----+---------+-------------------+
    
    users
        id              unsigned int(P)
        username        varchar(32)(U)
        password        varchar(123) // Hashed, like my potatoes
        ...
    
    +----+----------+----------+-----+
    | id | username | password | ... |
    +----+----------+----------+-----+
    |  1 | bob      | ******** | ... |
    |  2 | april    | ******** | ... |
    |  3 | grant    | ******** | ... |
    | .. | ........ | ........ | ... |
    +----+----------+----------+-----+
    
    users_roles
        id              unsigned int(P)
        user_id         unsigned int(F users.id)
        role_id         unsigned int(F roles.id)
    
    +----+---------+---------+
    | id | user_id | role_id |
    +----+---------+---------+
    |  1 |       1 |       1 |
    |  2 |       2 |       2 |
    | .. | ....... | ....... |
    +----+---------+---------+
    

    要确定用户是否具有特定权限,您可以执行如下查询:

    SELECT COUNT( roles_actions.id )
    FROM users
    LEFT JOIN users_roles ON users.id = users_roles.user_id
    LEFT JOIN roles_actions ON users_roles.role_id = roles_actions.role_id
    WHERE roles_actions.action_id = '<action.id>'
    

    【讨论】:

    • 谢谢,有道理。如果我理解正确,我必须为每个可能的组合扮演一个角色?我同意你所说的用户很少只有“创建”或“删除”权限。我很难创建硬“组”,但如果我考虑一下应用程序的实际使用方式,我可以简化一些。这在用户具有多个角色的情况下是否也有效?
    • @Jason - 您的业务规则将决定您需要什么角色,是的,每个用户都可以根据需要拥有尽可能多的角色。
    猜你喜欢
    • 2015-10-26
    • 2011-03-02
    • 1970-01-01
    • 2014-05-20
    • 1970-01-01
    • 2017-03-25
    • 1970-01-01
    • 2012-04-28
    • 2012-06-09
    相关资源
    最近更新 更多