2

我有一个基于 Zend 框架的 CMS。它Zend_Auth用于“CMS 用户”身份验证。CMS 用户具有使用Zend_Acl. 我现在正在尝试为诸如在线商店之类的东西创建“站点用户”。为简单起见,我想Zend_Auth为站点用户使用单独的实例。 Zend_Auth是作为单例编写的,所以我不确定如何实现这一点。

我不想通过角色来完成此任务的原因:

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

4 回答 4

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');

于 2010-11-30T21:58:10.943 回答
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

于 2012-11-08T10:07:17.547 回答
0

这是我的建议:

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

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

一个简单的插件可以让这个角色获得这个追索权

或者你可以像 unix 许可风格一样构建,但我想这个想法需要大量测试有一天我会在 ZF 中构建一个类似的:)

我希望我的想法对你有帮助

于 2010-11-30T22:15:35.577 回答
0

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

Zend_Auth 回答了“他声称是那个用户”这个问题?您可以做的是向您的持久性对象添加更多信息。最简单的选择是在您的数据库中再添加一列并将其添加到 result

于 2010-11-30T22:30:29.003 回答