Zend Navigation 多个 ACL 角色
Zend Navigation Multiple ACL roles
我正在尝试创建一个 ACL,其中用户在不同部门可能具有不同的角色。
用户被授予 role::guest
或 role::user
形式的角色,具体取决于他们是否登录。这是他们的 userRole
。 (还有一个role::superuser
可以访问所有部门)。
我还以 department::role
的形式将部门角色添加到 ACL(例如 bookings::user
)。这是他们的 departmentRole
.
用户部门角色存储在 Zend_Auth
身份中。
访问控制部分通过扩展Zend_Acl
和覆盖isAllowed
函数来工作。
这成功地允许或拒绝了每个用户。
public function isAllowed($role = null, $resource = null, $privilege = null)
{
$identity = Zend_Auth::getInstance()->getIdentity();
$userRole = $identity->role;
$departmentRoles = $identity->departmentRoles;
if (parent::isAllowed($userRole, $resource, $privilege))
{
return parent::isAllowed($userRole, $resource, $privilege);
}
else {
foreach ($departmentRoles as $departmentRole)
{
if(parent::isAllowed($departmentRole, $resource, $privilege))
{
return true;
}
}
}
return false;
}
我遇到的问题是 Zend_Navigation
需要一个 Acl 实例和一个用户角色。我构建导航菜单的视图脚本使用 $this->navigation()->accept($page)
仅针对单个用户角色进行验证。
如何为每个用户设置多个 Acl 角色并Zend_Navigation 显示他们有权访问的菜单项?
如果有更好/不同/正确的方法,请分享。
谢谢
编辑:
事实上,这种方法意味着超越 isAllowed()
中的核心功能,这让我认为这不是正确的方法。
现在,在我的 ACL 模型中,我获取所有用户、部门和协会,并循环为每个用户创建一个数组,该数组由他们在相关部门中的各种角色组成。然后我为每个用户创建一个角色并继承之前创建的数组中的角色。
到目前为止效果很好,这也意味着我还可以将用户添加为资源,并允许相关的管理员和部门经理修改他们的详细信息等。
这也意味着我可以将单个角色传递给Zend_Navigation并且菜单结构应该与他们的部门角色相关。
恕我直言,为单个用户设置多个 ACL 角色看起来像是反模式。 Zend_Navigation 规则绑定到单个角色的(多个)资源,这非常有意义。
禁止您为您的(部门)角色允许资源的限制是什么?
您始终可以对 ACL 角色使用继承。
如果您希望为单个用户设置多个角色,则可能需要单独的 ACL 规则。
Zend_View_Helper_Navigation_HelperAbstract::setDefaultAcl($acl);
Zend_View_Helper_Navigation_HelperAbstract::setDefaultRole($role);
我正在尝试创建一个 ACL,其中用户在不同部门可能具有不同的角色。
用户被授予 role::guest
或 role::user
形式的角色,具体取决于他们是否登录。这是他们的 userRole
。 (还有一个role::superuser
可以访问所有部门)。
我还以 department::role
的形式将部门角色添加到 ACL(例如 bookings::user
)。这是他们的 departmentRole
.
用户部门角色存储在 Zend_Auth
身份中。
访问控制部分通过扩展Zend_Acl
和覆盖isAllowed
函数来工作。
这成功地允许或拒绝了每个用户。
public function isAllowed($role = null, $resource = null, $privilege = null)
{
$identity = Zend_Auth::getInstance()->getIdentity();
$userRole = $identity->role;
$departmentRoles = $identity->departmentRoles;
if (parent::isAllowed($userRole, $resource, $privilege))
{
return parent::isAllowed($userRole, $resource, $privilege);
}
else {
foreach ($departmentRoles as $departmentRole)
{
if(parent::isAllowed($departmentRole, $resource, $privilege))
{
return true;
}
}
}
return false;
}
我遇到的问题是 Zend_Navigation
需要一个 Acl 实例和一个用户角色。我构建导航菜单的视图脚本使用 $this->navigation()->accept($page)
仅针对单个用户角色进行验证。
如何为每个用户设置多个 Acl 角色并Zend_Navigation 显示他们有权访问的菜单项?
如果有更好/不同/正确的方法,请分享。
谢谢
编辑:
事实上,这种方法意味着超越 isAllowed()
中的核心功能,这让我认为这不是正确的方法。
现在,在我的 ACL 模型中,我获取所有用户、部门和协会,并循环为每个用户创建一个数组,该数组由他们在相关部门中的各种角色组成。然后我为每个用户创建一个角色并继承之前创建的数组中的角色。
到目前为止效果很好,这也意味着我还可以将用户添加为资源,并允许相关的管理员和部门经理修改他们的详细信息等。
这也意味着我可以将单个角色传递给Zend_Navigation并且菜单结构应该与他们的部门角色相关。
恕我直言,为单个用户设置多个 ACL 角色看起来像是反模式。 Zend_Navigation 规则绑定到单个角色的(多个)资源,这非常有意义。 禁止您为您的(部门)角色允许资源的限制是什么? 您始终可以对 ACL 角色使用继承。
如果您希望为单个用户设置多个角色,则可能需要单独的 ACL 规则。
Zend_View_Helper_Navigation_HelperAbstract::setDefaultAcl($acl);
Zend_View_Helper_Navigation_HelperAbstract::setDefaultRole($role);