2014-11-24 61 views
2

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

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

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

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

回答

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
  • 权限:基本上只是一个键将被查询您的脚本中检查权限存储。
  • 角色:用户和权限之间的胶水。用户所属的角色和权限的总和将定义用户被允许执行的操作的总和。

这是基本设置。其他表只是帮助表连接在一起。

您的代码处理剩下的部分。建立一个(或更多更好)的课程来完成繁重的工作。然后将你的ACL实例传递给你的用户类(其他实现当然是可能的,请参阅帖子的底部)。

<?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传递给该实例?

这些问题取决于你喜欢什么,你的体系结构。 快乐编码!

+0

感谢。其实我在应用程序和数据库中也有类似的安排。但是,我没有完全后利用它认为具有每个角色的不同用户就可以解决我的problem.:-/ – kusa4indigeek 2014-11-24 11:44:35

+0

每次访问有一个数据库调用involved.Isnt一个性能问题? – 2015-01-21 17:18:35

+1

@nationbest你可能会考虑获取所有ACL相关数据每个请求后,保存在ACL对象来克服这个问题 – thpl 2015-01-23 06:58:16

相关问题