目前我只是在数据库表中使用这样的东西:
access: home,register,login
然后在每个页面中:
if(!Functions::has_rights('content'))
{
Functions::noAccess();
}
使用php&有更有效的方法吗MySQL的?我甚至可能希望访问页面的几个部分,例如,用户可以读取页面,但不对其进行注释,我不想为每个模块构建单独的系统。
答案 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查看列表。