除非您不是托管商,否则您可能不希望通过脚本动态创建数据库用户。想一想:
数据库用户是一个组件,它与您的应用程序进行交互,而不是与最终用户进行交互。
所以,坚持一个数据库为您的应用程序,并使用专用的表来建立您的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传递给该实例?
这些问题取决于你喜欢什么,你的体系结构。 快乐编码!
感谢。其实我在应用程序和数据库中也有类似的安排。但是,我没有完全后利用它认为具有每个角色的不同用户就可以解决我的problem.:-/ – kusa4indigeek 2014-11-24 11:44:35
每次访问有一个数据库调用involved.Isnt一个性能问题? – 2015-01-21 17:18:35
@nationbest你可能会考虑获取所有ACL相关数据每个请求后,保存在ACL对象来克服这个问题 – thpl 2015-01-23 06:58:16