2010-11-30 7 views
2

J'ai un CMS construit sur le Zend Framework. Il utilise Zend_Auth pour l'authentification "CMS User". Les utilisateurs CMS ont des rôles et des autorisations qui sont appliqués avec Zend_Acl. J'essaie maintenant de créer des "utilisateurs du site" pour des choses comme un magasin en ligne. Par souci de simplicité, je voudrais utiliser une instance distincte de Zend_Auth pour les utilisateurs du site. Zend_Auth est écrit comme un singleton, donc je ne suis pas sûr de savoir comment accomplir cela.Plusieurs instances (2) de Zend_Auth

Raisons je ne veux pas y arriver par des rôles:

  1. pollution des utilisateurs CMS avec les utilisateurs du site (visiteurs)
  2. Un utilisateur du site pourrait accidentellement obtenir des autorisations élevées
  3. Les utilisateurs sont définis plus précisément en tant que types différents que rôles différents
  4. Les deux types d'utilisateur sont stockés dans des bases de données/tables distinctes
  5. Un utilisateur de chaque type peut être connecté simultanément
  6. Différents types d'informations sont nécessaires pour les deux types d'utilisateurs
  7. refactorisation qui doit avoir lieu le code existant
+0

Vous devriez considérer l'utilisation des rôles pour votre CMS utilisateur 'et « Utilisateur du site 'au lieu d'avoir plusieurs niveaux d'authentification. –

+0

Merci Darryl, j'ai répondu à votre commentaire maintenant dans mon post. – Sonny

+1

+1 pour l'utilisation des rôles –

Répondre

4

Dans ce cas, vous voulez créer votre propre classe « Auth » pour étendre et supprimer le motif de conception 'singleton' qui existe dans Zend_Auth

Ceci n'est en aucun cas terminé, mais vous pouvez créer une instance et lui passer un 'espace de nommage'. Le reste des méthodes publiques de Zend_Auth devrait vous convenir.

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

Alors où vous voulez l'utiliser, $auth = new My_Auth('CMSUser'); ou $auth = new My_Auth('SiteUser');

+0

Test maintenant. Cela semble très prometteur! – Sonny

+2

Cela fonctionne, mais Zend_Auth n'est pas singleton pour aucune raison;) –

+0

J'ai déjà énoncé ma recommandation pour les rôles. Ce n'est pas mon travail de forcer mes croyances sur les autres :) –

0

qui est ma suggestion:

je pense que vous êtes dans le cas où vous devez calculer ACL, recours, rôles dynamique,

exemple {md5 (siteuser ou cmsuser + module + contrôleur) = nombre aléatoire pour chaque rôle}

et un sim plug-in PLE aurait ce rôle est autorisé à ce recours

ou vous pouvez construire comme le style d'autorisation unix mais je pense que cette idée doit beaucoup de tests un jour je vais construire un comme dans ZF :)

j'espère mon idée vous aide

+0

J'utilise ce modèle pour les "utilisateurs CMS" – Sonny

0

Vous mélangez des problèmes. (pas ce que je n'ai pas fait quand j'ai d'abord fait face id)

Zend_Auth répond à la question "est cet utilisateur qu'il prétend être"? Ce que vous pouvez faire est d'ajouter plus d'informations à votre objet de persistance. L'option la plus facile est de add one more column into your DB and add it to result.

+0

Merci Tomáš, j'utilise cette fonctionnalité – Sonny

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]; 
    } 
} 

Essayez celui-ci, juste devra utiliser App_Auth au lieu de Zend_Auth partout, ou App_auth sur la zone admin, Zend_Auth sur le devant