【问题标题】:What is the efficient way to make a permission system?建立权限系统的有效方法是什么?
【发布时间】:2011-03-02 23:00:51
【问题描述】:

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

access: home,register,login

然后在每一页中:

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

有没有更有效的方法来使用 php 和 MySQL?我什至可能想要访问一个页面的多个部分,例如,用户可以阅读一个页面,但不能访问它,并且我不想为每个模块构建一个单独的系统。

【问题讨论】:

    标签: php mysql permissions


    【解决方案1】:

    我相信您正在寻找的是访问控制列表,您可以在其中将问题建模为两件事:对象角色。 p>

    如果从头开始编写自定义示例,可能会使用或从中获得灵感的示例列表不完整:

    【讨论】:

    • Zend_Acl 是我在我的一个站点中使用的唯一 ZF,它非常棒。除非您想通过 ACLness 理论来了解更多信息(我经常喜欢这样做),否则我强烈建议您将其放在那里。
    • 两个链接都已损坏。前者可以找到here,后者现在好像不存在了。
    • @AlexW 谢谢,更新了链接并添加了一些示例,因为链接的 SO 答案已被删除。
    【解决方案2】:

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

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

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

    这是布局:

    +-----------------------+
    | 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 没有任何可以更改记录的权限。而且由于路由定义了不同请求方法的去向,因此您不能简单地 POST 到 /users 以查看列表。

    【讨论】:

      【解决方案3】:

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

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

      比如我有

      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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-08-20
        • 2011-12-23
        • 2018-12-29
        • 1970-01-01
        • 2022-05-23
        • 1970-01-01
        • 2011-06-28
        • 2011-03-11
        相关资源
        最近更新 更多