我们正在使用Zend框架和Mysql开发一个Web应用程序。
目前,帐户通过电子邮件地址是唯一的。我们希望能够允许帐户管理员授予对其他帐户管理员的访问权限。然后,此人将成为链接帐户的“用户”。然后,帐户持有人将登录其管理员帐户,然后选择他们想要访问的链接帐户。
请注意:访问权限应该只有一种方式。授予帐户2访问权限的帐户1不能访问帐户2.只有帐户2才能访问帐户1.如果帐户1需要访问帐户2,则帐户2必须授予帐户1的访问权限。
解决这个问题的最佳方法是什么?
答案 0 :(得分:1)
我认为尝试将权限绑定到帐户是您的问题,您需要添加第二个“图层”。我们坚持使用Google Analytics作为示例:
我们假设Joe Bloggs想要使用Google Analytics。他首先必须创建一个Google帐户(假设他还没有帐户)。然后,他为网站创建了Google Analytics帐户。说Joe然后想要访问Jane Smith,我们假设她已经有了一个Google帐户。为了让她能够访问,他正在使用Google帐户访问他的网站,而不是让她访问他的Google帐户。
Zend_Acl是基于角色的,所以让我们尝试将ZF概念应用于此示例。 GA中的用户管理屏幕允许您为用户提供“仅查看报告”访问权限或“帐户管理员”。因此,您需要在Zend_Acl中为每个访问级别定义一个角色:
$acl = new Zend_Acl();
$acl->addRole(new Zend_Acl_Role('guest'));
$acl->addRole(new Zend_Acl_Role('admin'), 'guest');
addRole上的第二个参数表示该角色应该继承指定的其他角色的所有权限。所以我上面所做的是定义两个角色:guest和admin;并且管理员应该继承客户拥有的所有权限。
然后你有了'资源',这是可以访问的东西。因此,我们将为报告定义一个,为用户管理定义一个:
$acl->add(new Zend_Acl_Resource('reports'));
$acl->add(new Zend_Acl_Resource('users'));
然后,我们将为“访客”提供对报告的访问权限,并为用户提供“管理员”访问权限:
$acl->allow('guest', 'reports');
$acl->allow('admin', 'users');
然后在相关的控制器(或插件,或任何地方),您可以检查权限:
public function reportsAction()
{
[...]
// assume $role contains the role of the currently logged in user
if (!$acl->isAllowed($role, 'reports')) {
// show a permissions error
}
}
public function usersAction()
{
[...]
if (!$acl->isAllowed($role, 'users')) {
// permissions error
}
}
只要将其存储在MySQL中,您只需要一个链接用户,站点(在此示例中)和角色的查找表:
userID | siteID | role
1 1 admin
2 1 guest