语境:
我的问题涉及一个我正在开发的论坛,就像SO一样:
我希望此ACL在站点范围内应用,默认情况下拒绝所有资源.
我阅读了使用Zend_Acl的基础知识 - 您基本上创建角色(访客,成员,管理员),并拒绝或允许这些角色的资源(控制器,方法).关于如何在应用程序中实际实现acl代码的文档并不是非常具体,所以我继续关注SO ..
来自marek的一个非常有用的stackoverflow 答案揭示了这个问题,但由于我的不熟悉,我仍然不能完全理解如何正确地实现这一点,并考虑到最佳实践.
海报configAcl.php
在应用程序根目录中有一个静态文件,用于初始化acl对象,添加角色,从每个控制器创建资源,提供admin
对所有内容的normal
访问,访问除管理员之外的所有内容,并将acl对象存储在注册表中以供以后使用.
$acl = new Zend_Acl();
$roles = array('admin', 'normal');
// Controller script names. You have to add all of them if credential check
// is global to your application.
$controllers = array('auth', 'index', 'news', 'admin');
foreach ($roles as $role) {
$acl->addRole(new Zend_Acl_Role($role));
}
foreach ($controllers as $controller) {
$acl->add(new Zend_Acl_Resource($controller));
}
// Here comes credential definiton for admin user.
$acl->allow('admin'); …
Run Code Online (Sandbox Code Playgroud) 有人可以指导我典型的ACL实现示例.就像'admin'可以访问'admin'模块一样,'user'可以访问'user module',而guest可以访问'open'页面.
我有一个登录后面的应用程序,并使用zend_acl和zend_auth.
在预分派期间,我有一个ACL插件,可以为ACL创建所有规则.我还有一个Auth插件,用于检查您是否已登录,如果可以,则根据ACL访问所请求的资源.
由于应用程序完全在登录后面,因此只有在您登录时才会创建ACL.
单元测试这似乎是不可能的,或者更可能是我错过了一些明显的东西.
在我的单元测试设置方法中,我模拟了一个返回zend_auth实例的成功登录.通过的测试表明此登录成功.
但是,如果我然后通过测试尝试分派到另一个位置,或者评估登录用户是否可以访问给定资源,则它总是被插件拒绝,因为它们仍然没有登录.我不知道为什么这是,有人可以提供建议吗?
例如,这传递:
public function testLoggedIn()
{
$this->assertTrue( Zend_Auth::getInstance()->hasIdentity() );
}
Run Code Online (Sandbox Code Playgroud)
这失败了,因为它被插件拒绝了:
public function testUserAccess()
{
$this->dispatch('/home');
$this->assertResponseCode(200);
$this->assertQueryContentContains('#nav_side');
$this->resetRequest()
->resetResponse();
}
Run Code Online (Sandbox Code Playgroud)
这个,我发现似乎仍然会重定向回登录页面,因为插件不知道用户已登录.
任何帮助非常感谢.
我的应用程序基于Zend Framework.我正在使用Zend_Auth
身份验证,但我不确定是否Zend_Acl
会对我有用,因为坦率地说,我看到的例子对我的需求来说太简单了或者让我困惑.
我正在考虑将我的应用程序中的元素作为资源,这些资源可以拥有权限.包含资源权限的角色是动态定义的,分配给用户.我将这些信息存储在规范化表格中.
角色实际上只是资源权限的集合,没有层次结构.资源的一个例子是'Page'.每个人都可以查看页面,但经过身份验证的用户需要"添加","编辑"或"删除"权限才能对页面执行任何其他操作.
这与Zend ACL相匹配吗?我是否会以一种会给我带来问题的方式思考ACL?
我的解决方案
Typeonerror获得了荣誉,但这是我的具体解决方案.
我扩展了Zend_Acl
以简化我的使用,因为我只加载当前用户的角色:
class My_Acl extends Zend_Acl
{
protected $_role_id;
public function setRole($role_id)
{
$this->_role_id = $role_id;
return $this->addRole($role_id);
}
public function getRole()
{
return $this->_role_id;
}
public function deny($resource, $privilege)
{
return parent::deny($this->_role_id, $resource, $privilege);
}
public function allow($resource, $privilege)
{
return parent::allow($this->_role_id, $resource, $privilege);
}
public function isAllowed($resource, $privilege)
{
return parent::isAllowed($this->_role_id, $resource, $privilege);
}
}
Run Code Online (Sandbox Code Playgroud)
要填充的ACL我执行一个查询返回resource
,privilege
和role_id
列.该 …
我正在使用标准的mvc范例编写一个zend框架应用程序,并添加了一个服务层来处理应用程序/业务逻辑.将访问控制放入您的服务而不是模块/控制器/操作似乎非常流行,但是,我只看到了具有这些角色的静态角色和权限的简单示例.
我的应用程序将使用动态acl,允许管理员用户添加角色并设置这些角色的权限.我有两个问题:
任何帮助将不胜感激.
我正在为我的应用程序实现RBAC,一切都是从数据库管理的.
例如,我将所有资源/权限存储在一个名为的表中permission
,所有角色都在role
表中,另一个表role_permission
用于定义哪个角色可以访问哪些资源/权限.
采用这种方法的目的是因为我希望应用程序的管理员自己创建role
并为角色分配权限.
该应用程序的用户可以具有例如多个角色administrator
,supervisor
,player
,referee
等.
我创建了一个模型类,Zend_Acl
用于添加角色和资源并为其分配权限.
以下是我的所作所为.
foreach($this->_roles as $role) {
$this->addRole(new Zend_Acl_Role($role['id']));
}
foreach($this->_permissions as $permmission) {
$this->addResource(new Zend_Acl_Resource($permmission['id']));
}
foreach($this->_rolePermissions as $value) {
$this->allow($value['role_id'], $value['permmission_id']);
}
$this->allow($this->_roleAdmin);
Run Code Online (Sandbox Code Playgroud)
如果我想检查特定角色的权限,例如通过使用此代码,它可以正常工作.
echo $acl->isAllowed($role, $permission) ? 'allowed' : 'denied';
Run Code Online (Sandbox Code Playgroud)
但是,我想检查具有多个角色的多个角色,具有多个角色的用户是否存在当前权限.
我应该如何检查具有多个角色的用户,例如referee
,supervisor
是否具有对资源的访问权限create report
.使用isAllowed(),您只能检查1个角色的权限.
我想知道使用Zend_Acl显示/隐藏部分视图的方式是什么?我想我会的
创建一个Controller插件,用于将登录的用户+ acl传递给视图
$this->view->loggedInUser = Zend_Auth::getIdentity();
$this->view->acl = Zend_Registry::get('acl');
Run Code Online (Sandbox Code Playgroud)然后在视图脚本中做类似的事情
$this->acl->isAllowed($this->view->loggedInUser, 'resource', 'privilege');
Run Code Online (Sandbox Code Playgroud)或者,还有更好的方法?或者我应该使用View Helper?返回一个布尔值是否允许登录用户?
我有一系列角色:
acl.roles.guest = null
acl.roles.member = "guest"
acl.roles.admin = "member"
acl.roles.owner = "admin"
Run Code Online (Sandbox Code Playgroud)
在...... Controller/Action/Helper/Acl.php我已经存储了_acl对象
这是获取我的角色和父母名单的方法吗?
$this->_acl->getParents ( 'admin' )
Run Code Online (Sandbox Code Playgroud)
应该回来
admin, member, guest
Run Code Online (Sandbox Code Playgroud)
作为数组或字符串(例如逗号分隔)
我正在使用Zend Acl和Zend Navigation.我在引导程序中设置导航.如果用户无权访问资源,我试图让链接不显示.我已阅读了几个教程,多次浏览了zend参考手册,但导航中的所有链接仍然出现在访客用户中,即使有些只应显示给管理员用户
protected function _initNavigationMenu()
{
$this->bootstrap("layout");
$layout = $this->getResource('layout');
$view = $layout->getView();
$navigation_model = new Core_Model_Navigation();
$result = $navigation_model->getTopLevelNavigationLinksForDisplay();
$sanitized = $navigation_model->sanatizeNavigationForDisplay($result);
$config = new Zend_Config($sanitized);
$nav = new Zend_Navigation($config);
$view->navigation($nav)
->setAcl($this->_acl->acl())
->setRole((string)BW::user() -> role);
}
Run Code Online (Sandbox Code Playgroud)
所有ACL角色和资源以及导航都来自数据库,以防万一
这是由$ sanitized创建的数组
Array
(
[0] => Array
(
[parent_id] => 0
[label] => File Manager
[order] => 1
[resource] => 9
[active] => 1
[visible] => 1
[internal_page] => 1
[module] => file
[reset_params] => 1
[id] => fileManagerLink …
Run Code Online (Sandbox Code Playgroud) 我想为我的应用程序构建一个具有以下要求的ACL系统.
我的ACL数据库结构如下
role:
+----------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| roleName | varchar(50) | NO | UNI | NULL | |
+----------+-------------+------+-----+---------+----------------+
permission:
+----------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| permissionName | varchar(50) …
Run Code Online (Sandbox Code Playgroud)