除非您不是托管商,否则您可能不想通过脚本动态创建数据库用户。想一想:
数据库用户是与您的应用程序而不是您的最终用户交互的组件。
因此,坚持为您的应用程序使用一个数据库,并使用专用表来构建您的 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?
这些问题取决于您喜欢什么以及您的架构。
快乐编码!