标签: zend-acl

实用的Zend_ACL + Zend_Auth实现和最佳实践

语境:

我的问题涉及一个我正在开发的论坛,就像SO一样:

  1. 有权访问查看主题但无法回复或投票的访客
  2. 具有足够代表的成员可以编辑/投票其他线程,默认情况下,他们可以回复并拥有与来宾相同的权限
  3. 管理员几乎可以做任何事情

我希望此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)

php zend-framework zend-auth zend-acl

42
推荐指数
1
解决办法
2万
查看次数

Zend Framework:需要典型的ACL示例

有人可以指导我典型的ACL实现示例.就像'admin'可以访问'admin'模块一样,'user'可以访问'user module',而guest可以访问'open'页面.

acl zend-framework zend-acl

16
推荐指数
2
解决办法
2万
查看次数

使用Zend Auth和Zend ACL进行PHP单元测试

我有一个登录后面的应用程序,并使用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)

这个,我发现似乎仍然会重定向回登录页面,因为插件不知道用户已登录.

任何帮助非常感谢.

php phpunit unit-testing zend-auth zend-acl

10
推荐指数
1
解决办法
3513
查看次数

Zend ACL是否适合我的需求?

我的应用程序基于Zend Framework.我正在使用Zend_Auth身份验证,但我不确定是否Zend_Acl会对我有用,因为坦率地说,我看到的例子对我的需求来说太简单了或者让我困惑.

我正在考虑将我的应用程序中的元素作为资源,这些资源可以拥有权限.包含资源权限的角色是动态定义的,分配给用户.我将这些信息存储在规范化表格中.

  1. 用户有角色
  2. 角色可以有多个资源
  3. 资源可以具有多个权限

角色实际上只是资源权限的集合,没有层次结构.资源的一个例子是'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,privilegerole_id列.该 …

php zend-framework zend-auth zend-acl

9
推荐指数
1
解决办法
2420
查看次数

如何将访问控制注入mvc应用程序的服务层?

我正在使用标准的mvc范例编写一个zend框架应用程序,并添加了一个服务层来处理应用程序/业务逻辑.将访问控制放入您的服务而不是模块/控制器/操作似乎非常流行,但是,我只看到了具有这些角色的静态角色和权限的简单示例.

我的应用程序将使用动态acl,允许管理员用户添加角色并设置这些角色的权限.我有两个问题:

  1. 如何将用户域中的权限映射到服务中的服务和方法的权限?我不相信它应该是1:1的映射.如果您的应用程序足够大,您将拥有许多具有许多方法的服务,并且权限结构很快会让最终用户设置角色权限变得混乱.
  2. 我有应用程序的全局服务,而不是特定于模块的服务.您将如何根据访问的模块为这些服务设置权限?

任何帮助将不胜感激.

acl zend-framework zend-acl service-layer

6
推荐指数
0
解决办法
473
查看次数

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-framework zend-acl

6
推荐指数
1
解决办法
2700
查看次数

什么是在View中使用Zend_Acl来显示/隐藏部分视图的方法

我想知道使用Zend_Acl显示/隐藏部分视图的方式是什么?我想我会的

  1. 创建一个Controller插件,用于将登录的用户+ acl传递给视图

     $this->view->loggedInUser = Zend_Auth::getIdentity();
     $this->view->acl = Zend_Registry::get('acl');
    
    Run Code Online (Sandbox Code Playgroud)
  2. 然后在视图脚本中做类似的事情

    $this->acl->isAllowed($this->view->loggedInUser, 'resource', 'privilege');
    
    Run Code Online (Sandbox Code Playgroud)

或者,还有更好的方法?或者我应该使用View Helper?返回一个布尔值是否允许登录用户?

zend-framework zend-acl zend-controller-plugin

5
推荐指数
1
解决办法
1632
查看次数

Zend_Acl找到所有继承的角色

我有一系列角色:

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)

作为数组或字符串(例如逗号分隔)

php inheritance zend-framework roles zend-acl

5
推荐指数
1
解决办法
2652
查看次数

Zend导航和Zend ACL

我正在使用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)

php zend-framework zend-acl zend-navigation

5
推荐指数
1
解决办法
8112
查看次数

Zend_Acl,角色和权限存储在数据库中

我想为我的应用程序构建一个具有以下要求的ACL系统.

  1. 将为用户分配单个或多个角色.(管理员,员工)等
  2. 角色将拥有权限.(Send_Invoices,Send_mail,Delete_Invoices,Send_Estimate)等.
  3. 除了继承的角色之外,将为用户分配自定义权限.

我的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)

acl zend-framework zend-acl

5
推荐指数
1
解决办法
3805
查看次数