许可系统最有效/最简单的方法?

时间:2013-10-18 19:21:43

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

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

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

蛋糕ACL

虽然记录不完整,但我对ACL系统的运作方式有所了解,并考虑按如下方式创建ARO:

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

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

DB

中的权限标志

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

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

1 个答案:

答案 0 :(得分:1)

这通常是我设置权限的方式 - 您可以执行actions rolesactions可以执行usersroles 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}}