Mysql 授予用户访问权限

Mysql 授予用户访问权限,mysql,zend-framework,Mysql,Zend Framework,我们正在使用Zend框架和Mysql开发一个web应用程序 目前,帐户是唯一的电子邮件地址。我们希望能够允许一个帐户的管理员授权访问另一个帐户的管理员。此人将成为链接帐户的“用户”。然后,帐户持有人将登录到他们的管理员帐户,然后选择他们想要访问的链接帐户 请注意:只能单向访问。授予访问帐户2权限的帐户1应无法访问帐户2。只有帐户2可以访问帐户1。如果帐户1想要访问帐户2,则帐户2必须授予对帐户1的访问权 最好的方法是什么 我认为试图将权限绑定到帐户是您的问题,您需要添加第二个“层”。让我们以谷歌

我们正在使用Zend框架和Mysql开发一个web应用程序

目前,帐户是唯一的电子邮件地址。我们希望能够允许一个帐户的管理员授权访问另一个帐户的管理员。此人将成为链接帐户的“用户”。然后,帐户持有人将登录到他们的管理员帐户,然后选择他们想要访问的链接帐户

请注意:只能单向访问。授予访问帐户2权限的帐户1应无法访问帐户2。只有帐户2可以访问帐户1。如果帐户1想要访问帐户2,则帐户2必须授予对帐户1的访问权


最好的方法是什么

我认为试图将权限绑定到帐户是您的问题,您需要添加第二个“层”。让我们以谷歌分析为例:

假设Joe Bloggs想使用Google分析。他首先必须创建一个谷歌账户(假设他还没有)。然后,他为自己的网站创建了一个谷歌分析账户。假设Joe想访问Jane Smith,假设她已经有一个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上的第二个参数表示该角色应从指定的其他角色继承所有权限。所以我在上面所做的是定义两个角色:来宾和管理员;并说管理员应该继承来宾拥有的所有权限

然后你就拥有了你的“资源”,这些资源是可以访问的。因此,我们将定义一个用于报告,另一个用于用户管理:

$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

简单地说:这是否意味着您需要创建用户组?这真的是mysql特有的吗?大多数web应用程序在应用程序级别实现“帐户”,并且仅将数据库用作数据存储。此外,您似乎在问题中以多种方式使用user/admin。更多的细节,更好的具体例子会更好。但从本质上说,你似乎在谈论过渡性许可。让我看看我是否能说得更清楚。“管理员”是帐户的所有者。“用户”是指有权使用该帐户但没有管理员权限的人。假设我们有两个账户。根据电子邮件地址,帐户是唯一的。帐户1希望帐户2为其管理帐户。为了实现这一点,帐户1必须授权另一个帐户。这样做将允许帐户2登录到自己的帐户,然后单击链接管理帐户1。这一概念与谷歌分析和谷歌Adwords账户管理的工作原理非常相似。