我一直在为我的大学开发一个需要基于角色的访问控制的PHP应用程序。我遵循的方法是为每个角色创建一个单独的MySQL用户。所以每个角色都有一个单独的db用户。这些数据库用户中的每一个都拥有该角色所需的最小表集的权限。
现在,我的问题是这是否是处理基于角色的应用程序的正确方法。我之所以遇到这种疑问的原因是因为现在是时候将系统联机(使用GoDaddy托管),我发现他们不允许创建具有特定于表特权的用户。事实上,他们甚至不允许通过SQL脚本直接创建用户(系统上的角色创建涉及通过执行SQL命令的php脚本创建用户)。
由于这个原因,我现在正在考虑我的方法是否是正确的方法。实现此类基于角色的系统的标准方法是什么?
这是我的第一个现场项目,所以我在实际交付真实项目方面并没有太多的经验。
答案 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 )
你基本上有三件事:
这是基本设置。其他表只是将各个部分组合在一起的辅助表。
您的代码处理其余部分。设置一个(或更好的)类来完成繁重的工作。然后将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 );
}
}
你应该得到基本概念。实际的实施取决于您。你可能想要考虑的事情:
User
的一部分,还是一个独立的组件?这些问题取决于您喜欢什么以及您的架构。 快乐的编码!