我正在使用CakePHP创建一个应用程序,并在尝试找出应用程序的权限系统时遇到了心理障碍。我把它缩小到几种不同的方法,我正在寻找一些信息,其中a)最容易实现和b)最有效(显然可以在这两者之间进行权衡)。
该应用程序有许多不同的模型,但为简化起见,我将只使用User,Department和Event。我希望能够在每个模型上单独控制每个用户的CRUD权限。
虽然记录不完整,但我对ACL系统的运作方式有所了解,并考虑按如下方式创建ARO:
[1]user
create
read
update
delete
[2]department
...
等。这将要求用户在许多不同的组中,并且从我所看到的,Cake不容易支持这一点。是否有更好的方法可以做到这一点,或者ACL不适合这种情况?
这个很简单,显然在用户的记录中有一个标志
create_users
,read_users
等。对于4-5个模型,这意味着16-20个字段用于权限,这使我考虑使用位掩码或使用连接表。其中一个比另一个好吗?哪一个更快,开销更少?
总的来说,我想我真的想知道从效率和易于开发的角度来看,在应用程序规模上哪种方法最有意义。如果您有过去项目的经验,我也会对如何解决这个问题提出其他建议。提前谢谢!
答案 0 :(得分: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>'
要确定用户是否具有特定权限,您可以执行以下查询:
{{1}}