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

时间:2014-11-24 08:23:32

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

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

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

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

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

1 个答案:

答案 0 :(得分:3)

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

  

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

因此,请为您的应用程序添加一个数据库,并使用专用表来构建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
  • 唯一定义的用户
  • 权限:基本上只是在您的脚本中查询以检查权限的密钥存储。
  • 角色:用户和权限之间的 glue 。用户所属角色的总和及其权限将定义允许用户执行操作的全部内容以及不允许执行操作的内容。

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

您的代码处理其余部分。设置一个(或更好的)类来完成繁重的工作。然后将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?

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