2010-11-30 3 views
2

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

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

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

Вы должны рассматривать, используя роли для вашего «пользователя CMS» и «Сайт пользователя 'вместо того, чтобы иметь несколько уровней аутентификации. – 2010-11-30 21:12:00

+0

Спасибо Даррил, я обратился к вашему комментарию сейчас в своем посте. – Sonny 2010-11-30 21:29:42

+1

+1 для использования ролей – 2010-11-30 22:01:04

ответ

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

+0

Тестирование сейчас. Это выглядит очень многообещающе! – Sonny 2010-11-30 22:29:08

0

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

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

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

и sim PLE плагин будет эта роль имеет право этого обращение

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

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

0

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

Zend_Auth отвечает на вопрос «это тот пользователь, которого он утверждает?»? Что вы можете сделать, так это добавить дополнительную информацию к вашему объекту persistence. Самый простой вариант - add one more column into your DB and add it to result.

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 на фронте