Несколько экземпляров (2) Zend_Auth

У меня есть CMS, построенная на Zend Framework. Он использует Zend_Auth для аутентификации «Пользователь CMS». Пользователи CMS имеют роли и разрешения, которые применяются с помощью Zend_Acl. Сейчас я пытаюсь создать «Пользователей сайта» для таких вещей, как интернет-магазин. Для простоты я хотел бы использовать отдельный экземпляр Zend_Auth для пользователей сайта. Zend_Auth написан как синглтон, поэтому я не уверен, как это сделать.

Причины, по которым я не хочу выполнять это по ролям:

  1. Засорение Пользователей CMS Пользователями Сайта (посетителями)
  2. Пользователь сайта мог случайно получить повышенные разрешения
  3. Пользователи более точно определяются как разные типы, чем разные роли
  4. Два типа пользователей хранятся в отдельных базах данных/таблицах.
  5. Одновременно можно было войти в систему по одному пользователю каждого типа.
  6. Для двух типов пользователей требуются разные типы информации.
  7. Рефакторинг, который необходимо будет выполнить в существующем коде

person Sonny    schedule 30.11.2010    source источник
comment
Вам следует рассмотреть возможность использования ролей для «Пользователя CMS» и «Пользователя сайта» вместо нескольких уровней аутентификации.   -  person Darryl E. Clarke    schedule 01.12.2010
comment
Спасибо, Дэррил, теперь я обратился к вашему комментарию в своем посте.   -  person Sonny    schedule 01.12.2010


Ответы (4)


В этом случае вы хотите создать свой собственный класс Auth, чтобы расширить и удалить шаблон проектирования «singleton», существующий в Zend_Auth.

Это ни в коем случае не завершено, но вы можете создать экземпляр и передать ему «пространство имен». Остальные публичные методы 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');

person Darryl E. Clarke    schedule 30.11.2010
comment
Тестирование сейчас. Это выглядит очень многообещающе! - person Sonny; 01.12.2010
comment
Это работает, но Zend_Auth не является одноэлементным без всякой причины;) - person Tomáš Fejfar; 01.12.2010
comment
Я уже высказал свою рекомендацию по ролям. Это не моя работа навязывать свои убеждения другим :) - person Darryl E. Clarke; 01.12.2010

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 спереди

person beebop    schedule 08.11.2012

это мое предложение:

я думаю, что вы в том случае, если вы должны динамически рассчитывать ACL, ресурсы, роли,

пример {md5(siteuser или cmsuser + модуль + контроллер) = случайное число для каждой роли}

и простой плагин позволил бы эту роль этому ресурсу

или вы можете построить как стиль разрешений unix, но я думаю, что эта идея требует много испытаний, однажды я создам такой же в ZF :)

надеюсь моя идея вам поможет

person tawfekov    schedule 30.11.2010
comment
Я использую этот шаблон для пользователей CMS - person Sonny; 01.12.2010

Вы смешиваете проблемы. (не то чтобы я не знал, когда впервые столкнулся с id)

Zend_Auth отвечает на вопрос «является ли этот пользователь тем, за кого себя выдает»? Что вы можете сделать, так это добавить дополнительную информацию к вашему объекту сохранения. Самый простой вариант — добавьте еще один столбец в свою БД и добавьте его в результат.

person Tomáš Fejfar    schedule 30.11.2010
comment
Спасибо Томаш, я использую эту функцию - person Sonny; 01.12.2010