标签: zend-auth

实用的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_Session/Zend_Auth随机抛出错误消息ps_files_cleanup_dir:opendir(/ var/lib/php5)失败:权限被拒绝(13)

我正在使用Zend_Auth(除其他外)使用Zend_Auth进行新的应用程序,但无论出于何种原因,此错误消息在任何位置完全随机出现(或者它接缝)

Zend_Session::start()- /home/hannes/workspace/develop/library/Zend/Session.php(Line:480):错误#8 session_start()[function.session-start]:ps_files_cleanup_dir:opendir(/ var/lib/php5)失败:权限被拒绝( 13)阵列

  • #0 /home/hannes/workspace/develop/library/Zend/Session/Namespace.php(143):Zend_Session :: start(true)
  • #1 /home/hannes/workspace/develop/library/Zend/Auth/Storage/Session.php(87):Zend_Session_Namespace - > __ construct('Zend_Auth')
  • #2 /home/hannes/workspace/develop/library/Zend/Auth.php(91):Zend_Auth_Storage_Session - > __ construct()
  • #3 /home/hannes/workspace/develop/library/Zend/Auth.php(141):Zend_Auth-> getStorage()
  • #4 /home/hannes/workspace/develop/xxxxxxx/application/controllers/AdminController.php(10):Zend_Auth-> hasIdentity()
  • #5 /home/hannes/workspace/develop/library/Zend/Controller/Action.php(133):AdminController-> init()
  • #6 /home/hannes/workspace/develop/library/Zend/Controller/Dispatcher/Standard.php(262):Zend_Controller_Action - > __ construct(Object(Zend_Controller_Request_Http),Object(Zend_Controller_Response_Http),Array)
  • #7 /home/hannes/workspace/develop/library/Zend/Controller/Front.php(954):Zend_Controller_Dispatcher_Standard-> dispatch(Object(Zend_Controller_Request_Http),Object(Zend_Controller_Response_Http))
  • #8 /home/hannes/workspace/develop/library/Zend/Application/Bootstrap/Bootstrap.php(97):Zend_Controller_Front-> dispatch()
  • #9 /home/hannes/workspace/develop/library/Zend/Application.php(366):Zend_Application_Bootstrap_Bootstrap-> run()
  • #10 /home/hannes/workspace/develop/xxxxxxx/public/index.php(26):Zend_Application-> run()
  • #11 {main}

php zend-framework zend-auth zend-session

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

将Zend_Auth存储后端$ _SESSION更改为Memcached

我正在尝试更改Zend_Auth的会话后端.但无法成功.在我的bootstrap.php;

    $oBackend = new Zend_Cache_Backend_Libmemcached(
        array(
            'servers' => $servers,
            'compression' => false
    ) );

    // configure caching frontend strategy
    $oFrontend = new Zend_Cache_Core(
        array(
            'caching' => true,
            'automatic_serialization' => true
        ) );

    // build a caching object
    $cache = Zend_Cache::factory( $oFrontend, $oBackend );

    $saveHandler = new \Application\Auth\Adapter\Memcached();
    $saveHandler->setCacher($cache);

    \Zend_Session::setSaveHandler($saveHandler);
Run Code Online (Sandbox Code Playgroud)

它成功地保存了值memcache没有问题.我测试一下;

    $namespace = new Zend_Session_Namespace();
    $namespace->name = "Fatih";
Run Code Online (Sandbox Code Playgroud)

在其他控制器;

    $ns = new Zend_Session_Namespace();
    var_dump($ns->name);
Run Code Online (Sandbox Code Playgroud)

没关系,但我在memcache中看不到Zend_Auth值.但是如果var_dump($_SESSION) 我能看到它就像;

["Zend_Auth"]=> array(1) { ["storage"]=> object(Application_Security_Auth_Storage)#66 (1) { ["_user":protected]=> object(Application_Security_Auth_User)#84 (4) { ["id":protected]=> object(MongoId)#87 (1) …
Run Code Online (Sandbox Code Playgroud)

php zend-framework zend-auth zend-session

14
推荐指数
1
解决办法
1026
查看次数

Zend Framework应用程序中的"会话已经启动...."异常

尝试加载Zend Framework应用程序时出现此错误:

致命错误:在/www/htdocs/w00a1ed7/autospin/redaktion/library/Zend/Session.php:462中,带有消息'session'的未捕获异常'Zend_Session_Exception'已由session.auto-start或session_start()启动

堆栈跟踪:

#0 /www/htdocs/w00a1ed7/autospin/redaktion/library/Zend/Session/Namespace.php(143):Zend_Session :: start(true)

#1 /www/htdocs/w00a1ed7/autospin/redaktion/library/Zend/Auth/Storage/Session.php(87):Zend_Session_Namespace - > __ construct('Zend_Auth')

#2 /www/htdocs/w00a1ed7/autospin/redaktion/library/Zend/Auth.php(91):Zend_Auth_Storage_Session - > __ construct()

#3 /www/htdocs/w00a1ed7/autospin/redaktion/library/Zend/Auth.php(141):Zend_Auth-> getStorage()

#4 /www/htdocs/w00a1ed7/autospin/redaktion/application/layouts/scripts/layout.phtml(31):Zend_Auth-> hasIdentity()

#5 /www/htdocs/w00a1ed7/autospin/redaktion/library/Zend/View.php(108):include('/ www/htdocs/w00 ...')

#6 /www/htdocs/w00a1ed7/autospin/redaktion/library/Zend/View/Abstract.php(831):Zend_View - > _ run('/ www/htdocs/w00 ...')

#7/www/htdocs/w00a1ed在第462行/www/htdocs/w00a1ed7/autospin/redaktion/library/Zend/Session.php

Zend_Auth在我的本地服务器上使用它并且运行良好,但在生产服务器上我得到了前面的错误,但不是每次都有.

我检查了文件中session.autostart设置0.htaccess内容.

我该如何解决这个错误?


感谢您的回答,但我没有在任何地方使用session_start().仅适用于ZF.

我只在共享服务器上有这个问题,在我的本地服务器脚本上工作得很好.

我在这段代码中使用INIT函数:

protected $ user;

public function init()
{   
    if(!Zend_Auth::getInstance()->hasIdentity())
    {
        $this->_redirect('auth/login');
    }else
    {
        $this->user = Zend_Auth::getInstance()->getIdentity();
    }
}
Run Code Online (Sandbox Code Playgroud)

我已经尝试仅在indexAction中设置tis代码,以便其他操作不必查看Auth ...但仍然有问题.

我有没有办法设置一个Action不要检查会话或这样的想法?

Beste问候

php .htaccess session zend-framework zend-auth

11
推荐指数
3
解决办法
3万
查看次数

使用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
查看次数

Zend_Auth:允许用户登录到多个表/标识

Zend_Auth用于在门户网站中进行身份验证.

一个正常的mySQL"users"表与a loginpassword列被查询,并且用户登录.

但是,我还有两组我想要进行身份验证的用户.所有这三个用户组都在其他表中拥有登录数据.他们的数据来自外部来源,因此不希望将这些登录帐户合并为一个.

因此,用户可能是来自三个组中的任何一个的经过身份验证的用户,甚至是所有三个组,同时也是这三个组中的任何一个.

三个登录组中的每一个都有自己的登录表单和注销按钮.

目前,我有一个单一,直接的Zend_Auth登录,取自一些教程并稍加修改,看起来大致如下:

function login($user, $password)
{

$auth = Zend_Auth::getInstance();
$storage = new Zend_Auth_Storage_Session();

$auth->setStorage($storage);

$adapter = new Zend_Auth_Adapter_DbTable(....);

$adapter->setIdentity($username)->setCredential($password); 

$result = $auth->authenticate($adapter);

if ($result->isValid())
 ......... success!
else 
 .... fail!
Run Code Online (Sandbox Code Playgroud)

我将在哪里开始提供此服务并解决三个组的单独"登录"状态?我的想法是,我想分享会话,并分别管理身份验证.

这可能吗?也许有一个简单的前缀使这很容易?这个问题上是否存在任何教程或资源?

我是Zend Framework的新手.

php zend-framework zend-auth

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

Zend_Auth setCredentialTreatment

我正在使用Zend_AuthsetCredentialTreatment来设置哈希方法和盐.我看到所有的例子都是这样的,其中salt似乎是作为文本插入的.

- > setCredentialTreatment('SHA1(CONCAT(盐))?

但我的盐存储在数据库中.我可以先检索它然后使用它setCredentialTreatment但是有没有办法可以直接将它定义为字段名称,所以setCredentialTreatment会知道从那个字段中获取它吗?有点像我们为用户名或密码定义字段名称的方式

->setCredentialColumn('password')
Run Code Online (Sandbox Code Playgroud)

我遇到的另一个问题是我想使用SHA512而不是SHA1.这可能还是不可用?我看到的所有示例都使用SHA1.

我应该说我是一个相当新的zend并且正在移植一个现有的应用程序,所以请轻松地告诉我答案.

php security hash zend-framework zend-auth

8
推荐指数
1
解决办法
5705
查看次数

使用Zend_Auth设置和扩展Session Lifetime

我使用Zend_Auth作为我的一个项目,但到目前为止还没有弄清楚如何设置会话的生命周期,或者如何扩展它(假设它应该运行5分钟并且应该在用户做出动作时重置为),这是我的初始化代码:

        $authAdapter = new Zend_Auth_Adapter_DbTable($this->_model->pdo);
        $authAdapter->setTableName('normal_folks')
           ->setIdentityColumn('username')
           ->setCredentialColumn('password');

        $post = $this->_request->getPost();

        $authAdapter->setIdentity($post['username'])
            ->setCredential($post['password']);
        $auth = Zend_Auth::getInstance();
        $result = $auth->authenticate($authAdapter);

        if($result->isValid())
        {
            $userInfo = $authAdapter->getResultRowObject(null, 'password');
            $authStorage = $auth->getStorage();
            $authStorage->write($userInfo);

            if(strlen($post['refferer']) > 1){
                header("Location: ".$post['refferer']);
            }elseif(strlen($this->_request->getParam('ref_action')) > 1){
                Zend_Controller_Action::_forward($this->_request->getParam('ref_action'),"admin",null,null);
            }else{
                Zend_Controller_Action::_forward("index","admin",null,null);
            }
        }
Run Code Online (Sandbox Code Playgroud)

蚂蚁这个我如何检查用户是否登录:

                if(Zend_Auth::getInstance()->hasIdentity()){
                    echo "Woho!";
                }else{
                    die("invalid-identity");
                }
Run Code Online (Sandbox Code Playgroud)

它可能就在我面前,但我无法理解,帮助?请?好吗?:d

php session zend-framework lifetime zend-auth

8
推荐指数
1
解决办法
9747
查看次数

Zend 2 + doctrine 2 Auth Adapter

我在寻找身份验证的教程与Zend 2和学说2.特别是创建控制器和适配器.

官方文档过于全球化对我没有帮助.

谢谢

编辑:

我使用"Doctrine Entity"(名称空间User\Entity;)

实体在module.config.php文件中注册:

'doctrine' => array(
    'driver' => array(
        __NAMESPACE__ . '_driver' => array(
            'class' => 'Doctrine\ORM\Mapping\Driver\AnnotationDriver',
            'cache' => 'array',
            'paths' => array(__DIR__ . '/../src/' . __NAMESPACE__ . '/Entity')
        ),
        'orm_default' => array(
            'drivers' => array(
                __NAMESPACE__ . '\Entity' => __NAMESPACE__ . '_driver'
            )
        )          
    ),
)
Run Code Online (Sandbox Code Playgroud)

但是现在,我如何将我的identityClass键指向我的适配器?控制器:

use Zend\Mvc\Controller\AbstractActionController,
    Zend\View\Model\ViewModel,
    Zend\Authentication\AuthenticationService,
    Doctrine\ORM\EntityManager,
    DoctrineModule\Authentication\Adapter\ObjectRepository as DoctrineAdapter,        
    User\Entity\User,  
    User\Form\UserForm;
class UserController extends AbstractActionController 
{
protected $em;

public function setEntityManager(EntityManager $em)
{
    $this->em = $em;
}

public …
Run Code Online (Sandbox Code Playgroud)

zend-auth doctrine-orm zend-framework2

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