繁体   English   中英

在php应用程序中实现基于角色的访问控制

[英]Implementing Roles based access control in php application

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

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

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

这是我的第一个实时项目,因此我在实际交付实际项目方面并没有太多的经验。

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

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

因此,请为您的应用程序保留一个数据库,并使用专用表来构建您的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?

这些问题取决于您喜欢什么以及您的体系结构。 编码愉快!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM