【问题标题】:Implementing Roles based access control in php application在 php 应用程序中实现基于角色的访问控制
【发布时间】:2015-01-21 21:51:30
【问题描述】:

我一直在为我的大学开发一个需要基于角色的访问控制的 PHP 应用程序。我遵循的方法是为每个角色创建一个单独的 MySQL 用户。所以每个角色都有一个单独的数据库用户。这些 db 用户中的每一个都拥有角色所需的最小表集的权限。

现在,我的问题是这实际上是否是处理基于角色的应用程序的正确方法。我之所以产生这种疑问是因为现在是时候让系统联机(使用 GoDaddy 托管)了,我发现他们不允许创建具有表特定权限的用户。事实上,他们甚至不允许直接通过 SQL 脚本创建用户(系统上的角色创建涉及通过执行 SQL 命令的 php 脚本创建用户)。

因此,我现在正在考虑我的方法是否实际上是正确的方法。实施这种基于角色的系统的标准方法是什么?

这是我的第一个现场项目,所以在实际交付实际项目方面,我之前并没有太多经验。

【问题讨论】:

    标签: php mysql project roles web-application-project


    【解决方案1】:

    除非您不是托管商,否则您可能不想通过脚本动态创建数据库用户。想一想:

    数据库用户是与您的应用程序而不是您的最终用户交互的组件。

    因此,坚持为您的应用程序使用一个数据库,并使用专用表来构建您的 ACL。 您的数据库架构可能如下所示:

    users( id:pk, name )
    roles( id:pk, name )
    permissions( id:pk, key, description )
    permission_role( permission_id:fk, role_id:fk )
    role_user( role_id:fk, user_id:fk )
    

    你在这里基本上有三件事:

    • 用户:没什么特别的。只是一个可以由其 id 唯一定义的用户
    • 权限:基本上只是一个密钥库,将在您的脚本中查询以检查权限。
    • 角色:用户和权限之间的粘合剂。用户所属角色的总和及其权限将定义用户可以做什么和不可以做什么的全部内容。

    这是基本设置。其他表只是将各个部分连接在一起的辅助表。

    您的代码处理其余部分。设置一个(或更好的)类来完成繁重的工作。然后将您的 ACL 实例传递给您的 User 类(当然也可以使用其他实现。请参阅文章底部)。

    <?php 
    
    class Acl implements AclInterface {
    
        public function hasPermissionTo( $action )
        {
            // Query DB and check if a record exists
            // in the role_user table where the 
            // user_id matches with the current user
            // and join the role_id with `roles` and then
            // with `permission_role` to see if the user
            // is permitted to perform a certain action
        }
    
    }
    
    class User {
    
        protected $acl;
    
        public function __construct( AclInterface $acl )
        {
            $this->acl = $acl;
        }
    
        public function hasPermissionTo( $action )
        {
            return $this->acl->hasPermissionTo( $action );
        }
    
    }
    

    您应该了解基本概念。实际实施取决于您。您可能需要考虑的事项:

    • 您希望您的 ACL 成为您的 User 的一部分还是一个独立的组件?
    • 您想如何将当前用户传递给 ACL?您想将当前用户的实例传递给 ACL,还是只传递用户 ID?

    这些问题取决于您喜欢什么以及您的架构。 快乐编码!

    【讨论】:

    • 谢谢。实际上,我的应用程序和数据库中确实有类似的安排。但是,我后来没有充分利用它,因为我认为每个角色有不同的用户可以解决我的问题。:-/
    • 每次访问都涉及一个数据库调用。这不是性能问题吗?
    • @nationbest 您可能会考虑每次请求获取所有 acl 相关数据并将其存储在 Acl 对象中以克服此问题
    猜你喜欢
    • 1970-01-01
    • 2020-02-28
    • 2012-03-22
    • 2020-12-12
    • 2013-10-31
    • 1970-01-01
    • 2016-12-27
    • 2012-12-06
    相关资源
    最近更新 更多