Zend_Auth的多个实例(2)

时间:2010-11-30 21:02:01

标签: php zend-framework zend-auth zend-acl

我有一个基于Zend Framework构建的CMS。它使用Zend_Auth进行“CMS用户”身份验证。 CMS用户拥有使用Zend_Acl强制执行的角色和权限。我现在正在尝试为在线商店之类的东西创建“网站用户”。为简单起见,我想为网站用户使用单独的Zend_Auth实例。 Zend_Auth是作为单身人士写的,所以我不知道如何做到这一点。

我不希望通过角色来实现这一目标的原因:

  1. 使用网站用户(访客)的CMS用户污染
  2. 网站用户可能会意外获得提升权限
  3. 用户被更准确地定义为不同类型而不是不同角色
  4. 这两种用户类型存储在单独的数据库/表中
  5. 每种类型的一个用户可以同时登录
  6. 两种用户类型需要不同类型的信息
  7. 需要对现有代码进行重构

4 个答案:

答案 0 :(得分:4)

在这种情况下,你想创建自己的'Auth'类来扩展和删除Zend_Auth中存在的'singleton'设计模式

这绝不是完整的,但您可以创建一个实例并将其传递给“命名空间”。 Zend_Auth的其他公共方法应该没问题。

<?php
class My_Auth extends Zend_Auth
{

    public function __construct($namespace) {
        $this->setStorage(new Zend_Auth_Storage_Session($namespace));
        // do other stuff
    }
    static function getInstance() {
        throw new Zend_Auth_Exception('I do not support getInstance');
    }  
}

然后,您想要使用它,$auth = new My_Auth('CMSUser');$auth = new My_Auth('SiteUser');

答案 1 :(得分:1)

class App_Auth
{
    const DEFAULT_NS = 'default';

    protected static $instance = array();

    protected function __clone(){}

    protected function __construct() {}

    static function getInstance($namespace = self::DEFAULT_NS) {
        if(!isset(self::$instance[$namespace]) || is_null(self::$instance[$namespace])) {
            self::$instance[$namespace] = Zend_Auth::getInstance();
            self::$instance[$namespace]->setStorage(new Zend_Auth_Storage_Session($namespace));
        }

        return self::$instance[$namespace];
    }
}

试试这个,只需要在任何地方使用App_Auth而不是Zend_Auth,或者在管理区域使用App_auth,在前面使用Zend_Auth

答案 2 :(得分:0)

这是我的建议:

我认为你应该动态计算ACL,资源,角色,

示例{md5(siteuser或cmsuser + module + controller)=每个角色的随机数}

和一个简单的插件将允许此角色使用

或者你可以构建像unix权限样式,但我想这个想法需要很多测试 有一天,我将在ZF中建立一个像这样的人。

我希望我的想法可以帮助你

答案 3 :(得分:0)

你在混合问题。 (当我第一次面对id时,并不是我没有这样做)

Zend_Auth回答的问题是“他声称自己是那个用户”吗?您可以做的是向持久性对象添加更多信息。最简单的选择是add one more column into your DB and add it to result