制作权限系统的有效方法是什么?

时间:2010-06-12 07:53:32

标签: php mysql permissions

目前我只是在数据库表中使用这样的东西:

access: home,register,login

然后在每个页面中:

if(!Functions::has_rights('content'))
{
     Functions::noAccess();
}

使用php&有更有效的方法吗MySQL的?我甚至可能希望访问页面的几个部分,例如,用户可以读取页面,但不对其进行注释,我不想为每个模块构建单独的系统。

3 个答案:

答案 0 :(得分:3)

我相信您所寻找的是访问控制列表,您可以将问题建模为两个方面:对象角色

可能使用的示例列表不完整,或者从头开始编写自定义示例时会受到启发:

答案 1 :(得分:3)

我使用“* NIX-type”权限系统构建了一个。

我对页面有不同类型的权限(读取,修改,删除,评论,投票),我为每个页面分配了一些权限。

所以例如我有

define ('USER_CANREAD', 1);
define ('USER_CANMODIFY', 2);
define ('USER_CANDELETE', 4);
define ('USER_CANINSERT', 8);
define ('USER_CANCOMMENT', 16);
define ('USER_CANVOTE', 32);

然后,如果用户可以阅读,评论和投票,则许可将为1 + 16 + 32 = 49

要检查权限,我只需对这些值进行按位AND。

例如user->permissions & USER_CANDELETE检查用户是否可以删除该页面(显然我有一个canDelete功能)

答案 2 :(得分:1)

如果您使用某种路由,则使ACL(访问控制列表)取决于您定义的路由是有意义的。

我通常使用HABTM关系中的权限表和permissions_users表运行。这样,当路由匹配时,可以查找权限。如果用户没有权限,则拒绝访问。 这可以通过检查不同类型的方法GET,POST,PUT和DELETE来改进。

这是因为我喜欢有机会从网络界面编辑权限和设置,并允许非其他人做同样的事情(即营销人员)。

这是布局:

+-----------------------+
| permissions           |
+-----------------------+
| id | pattern | method |
+-----------------------+
| 1  |           | GET  | # => Will hit the root of your application
| 2  | users     | GET  | # => Will hit users/, usually listing the users
| 3  | users     | PUT  | # => Will hit anyone trying to insert a new user into the system.
| 4  | users/:id | GET  | # => Will hit anyone who tries to view a specific user
| 5  | users/:id | POST | # => Will hit anyone trying to update a user
+-----------------------+

+-------------------------+
| permissions_users       |
+-------------------------+
| user_id | permission_id |
+-------------------------+
| 1       | 1             | # => Will allow to view the root of the application
| 1       | 2             | # => Will allow to view the users list
+-------------------------+

因此,用户1没有任何可能改变记录的权利。由于路由定义了不同请求方法的位置,因此您无法向/ users查看列表。