0

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

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

蛋糕 ACL

虽然文档很少,但我对 ACL 系统的工作原理有了一定的了解,并考虑按如下方式创建 ARO:

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

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

数据库中的权限标志

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

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

4

1 回答 1

1

这通常是我设置权限的方式——你有actions那个可以执行,roles那个可以执行那些actionsusers谁有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>'
于 2013-10-18T19:51:48.073 回答