2012-09-20 9 views
7

के लिए उपयोगकर्ता प्रदाता का विस्तार करें मैं सिम्फनी 2 का उपयोग कर साइट बना रहा हूं और यह एक श्वेत-लेबल प्रकार की साइट होगी, जहां एकाधिक डोमेन एक ही सर्वर पर मैप करते हैं। तो coolsite.customer1.com और aservice.customer2.com एक ही साइट पर मैप करेगा, लेकिन अंतिम उपयोगकर्ता को अलग दिखने की आवश्यकता होगी। मैंने डोमेन के लिए पहले ही हल किया है, और एक सेवा के रूप में अद्वितीय विन्यास लोड कर रहा हूं।एफओएस उपयोगकर्ता बंडल

एफओएस उपयोगकर्ता बंडल सेटअप के साथ और एक कस्टम उपयोगकर्ता (जिसमें डोमेन_आईडी संग्रहीत है) के साथ चल रहा है, पंजीकरण, लॉगिन इत्यादि ठीक काम करता है सिवाय इसके कि डोमेन 1 से उपयोगकर्ता डोमेन 2 में भी लॉगिन कर सकते हैं। यह एफओएस उपयोगकर्ता बंडल में अपेक्षित है। मुझे बंडल में संशोधन करने की आवश्यकता है ताकि यह केवल उन डोमेन पर उपयोगकर्ताओं को प्रमाणित करे जिन्हें वे सौंपा गया है।

मैंने एक उपयोगकर्ता प्रदाता बनाया है जो मूल उपयोगकर्ता प्रदाता को FOS में विस्तारित करता है और डोमेन की जांच करने के लिए loadUserByUsername विधि को ओवरराइड कर दिया है। नीचे देखें:

use FOS\UserBundle\Security\UserProvider as FOSProvider; 
use Symfony\Component\DependencyInjection\ContainerInterface; 
use FOS\UserBundle\Model\UserManagerInterface; 
use Me\CoreBundle\Models\Core; 

class UserProvider extends FOSProvider { 

    /** 
    * 
    * @var ContainerInterface 
    */ 
    protected $container; 


    public function __construct(UserManagerInterface $userManager, ContainerInterface $container) { 
     parent::__construct($userManager); 
     $this->container = $container; 
    } 

    /** 
    * {@inheritDoc} 
    */ 
    public function loadUserByUsername($username) 
    { 
     $core = $this->container->get('me_core'); 
     /* @var $core Core */ 

     $user = $this->findUserBy(array(
      'username'=>$username, 
      'domain_id'=>$core->getDomainMap()->getId(), 
     )); 

     if (!$user) { 
      throw new UsernameNotFoundException(sprintf('Username "%s" does not exist.', $username)); 
     } 

     return $user; 
    } 

    public function findUserBy(array $criteria) { 
     return $this->userManager->findUserBy($criteria); 
    } 

} 

मैंने निम्नलिखित के साथ सेवा को कॉन्फ़िगर किया है।

services: 
    me.security.authentication.userprovider: 
    class: Me\UserBundle\Security\UserProvider 
    arguments: 
     - @fos_user.user_manager 
     - @service_container 

मेरे security.yml इस तरह दिखता है:

security: 
    providers: 
     me.security.authentication.userprovider: 
      id: fos_user.user_provider.username 

    encoders: 
     FOS\UserBundle\Model\UserInterface: sha512 

    firewalls: 
     main: 
      pattern: ^/ 
      form_login: 
       provider: fos_userbundle 
       csrf_provider: form.csrf_provider 
      logout:  true 
      anonymous: true 

    access_control: 
     - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY } 
     - { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY } 
     - { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY } 
     - { path: ^/_wdt, role: IS_AUTHENTICATED_ANONYMOUSLY } 
     - { path: ^/public, role: IS_AUTHENTICATED_ANONYMOUSLY } 
     - { path: ^/admin/, role: ROLE_ADMIN } 
     - { path: ^/, role: ROLE_USER } 

    role_hierarchy: 
     ROLE_ADMIN:  ROLE_USER 
     ROLE_SUPER_ADMIN: ROLE_ADMIN 

क्या होता है जब मैं का उपयोग करने की साइट एक अपवाद है की कोशिश करो। "ServiceNotFoundException: सेवा" security.authentication.manager security.user.provider.concrete.fos_userbundle "एक न के बराबर सेवा पर एक निर्भरता है"

मैं This Cookbook Recipe

पर अपने संशोधनों आधारित "।" कोई विचार? मैं इस पर पूरी तरह से फंस गया हूँ।

+1

वैसे मैं प्रदाता का परिवर्तित नाम काम करने में सक्षम था, क्योंकि मैं प्रदाता को फ़ायरवॉल/मुख्य/form_login अनुभाग में अद्यतन करना भूल गया था। अब लॉगिन प्रक्रिया ठीक उसी तरह काम कर रही है जैसे मैंने कोई बदलाव नहीं किया है, और मैंने जो प्रदाता निर्दिष्ट किया है उसे नहीं कहा जा रहा है। मैं यह सत्यापित करने में सक्षम था कि इसे एक गूंज और कन्स्ट्रक्टर में निकास कमांड छोड़कर बुलाया नहीं जा रहा था। – Wpigott

+0

वैसे मैं इसे हल करने में सक्षम था। मैं 8 घंटे के लिए अपने प्रश्न का उत्तर देने में सक्षम नहीं हूं, इसलिए मैं इसे उस बिंदु पर हल कर दूंगा और पोस्ट करता हूं कि मैंने इसे कैसे हल किया। – Wpigott

उत्तर

6

मैं इसे काम करने में सक्षम था। बाहर निकलता है मुझे "आईडी" को उस सेवा के नाम के समान बनाने की आवश्यकता होती है जिसका मैं उपयोग कर रहा था। टिप्पणी की गई पंक्तियां मूल हैं जो बंडल के साथ आईं।

security: 
    providers: 
     me.security.authentication.userprovider: 
      id: me.security.authentication.userprovider 
     #fos_userbundle: 
      #id: fos_user.user_provider.username 
संबंधित मुद्दे