के लिए उपयोगकर्ता प्रदाता का विस्तार करें मैं सिम्फनी 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 "एक न के बराबर सेवा पर एक निर्भरता है"
पर अपने संशोधनों आधारित "।" कोई विचार? मैं इस पर पूरी तरह से फंस गया हूँ।
वैसे मैं प्रदाता का परिवर्तित नाम काम करने में सक्षम था, क्योंकि मैं प्रदाता को फ़ायरवॉल/मुख्य/form_login अनुभाग में अद्यतन करना भूल गया था। अब लॉगिन प्रक्रिया ठीक उसी तरह काम कर रही है जैसे मैंने कोई बदलाव नहीं किया है, और मैंने जो प्रदाता निर्दिष्ट किया है उसे नहीं कहा जा रहा है। मैं यह सत्यापित करने में सक्षम था कि इसे एक गूंज और कन्स्ट्रक्टर में निकास कमांड छोड़कर बुलाया नहीं जा रहा था। – Wpigott
वैसे मैं इसे हल करने में सक्षम था। मैं 8 घंटे के लिए अपने प्रश्न का उत्तर देने में सक्षम नहीं हूं, इसलिए मैं इसे उस बिंदु पर हल कर दूंगा और पोस्ट करता हूं कि मैंने इसे कैसे हल किया। – Wpigott