2012-10-03 15 views
6

मैं http://symfony.com/doc/current/cookbook/security/voters.html का अनुसरण कर रहा हूं और एक कस्टम मतदाता बनाने का प्रयास कर रहा हूं जो उन अनुरोधों तक पहुंच से इनकार करता है जिनमें वैध एपीआई कुंजी नहीं है और शीर्षलेख में पचाना है (http://symfony.com/doc/current/cookbook/security/custom_authentication_provider.html से प्रभावित - मैं प्रमाणीकरण प्रदाता नहीं बना रहा हूं क्योंकि मुझे इसकी आवश्यकता है उसी अनुरोध के लिए FOSUserBundle प्रदाता का उपयोग करें)।सेवा में इन-मेमोरी उपयोगकर्ता प्रदाता को इंजेक्ट कैसे करें?

मैं इन-मेमोरी उपयोगकर्ता प्रदाता में अपनी एपीआई कुंजी/रहस्यों को स्टोर करना चाहता हूं और बाद में इसे एक कस्टम mongodb प्रदाता को बाद में दिनांक में माइग्रेट करना चाहता हूं। इसलिए मुझे अपने मतदाता में उपयोगकर्ता प्रदाता को इंजेक्शन देने का एक तरीका चाहिए। मैंने पहले से ही सेवा कंटेनर इंजेक्शन दिया है, लेकिन क्या उपयोगकर्ता प्रदाताओं से इसका उपयोग किया जा सकता है?

मेरी सेवा परिभाषा:

services: 
    security.access.api_client_voter: 
     class:  Acme\RestBundle\Security\Authorization\Voter\ApiClientVoter 
     arguments: [@service_container, %kernel.cache_dir%/security/nonces] 
     public: false 
     tags: 
      - { name: monolog.logger, channel: authentication } 
      - { name: security.voter } 

तो मेरे सवाल का, मैं कैसे इन-स्मृति प्रदाता इंजेक्षन करते है? कुकबुक में डब्लूएसएसई उदाहरण स्ट्रिंग 'security.providers.in_memory' को प्रतिस्थापित करने के लिए एक ऑथ प्रदाता फैक्ट्री का उपयोग करता प्रतीत होता है, लेकिन जैसा कि मैं सिर्फ मतदाता का उपयोग कर रहा हूं, क्या यह आवश्यक है? यदि यह आवश्यक है, तो मेरा कारखाना कैसा दिखता है?

उत्तर

7

इन-मेमोरी उपयोगकर्ता प्रदाता को पहले सुरक्षाबंडल के security.xml में एक सार सेवा के रूप में परिभाषित किया गया है। security.yml में आपके उपयोगकर्ता प्रदाता की कॉन्फ़िगरेशन के आधार पर, सुरक्षाबंडल का SecurityExtension तब कंक्रीट इन-मेमोरी उपयोगकर्ता प्रदाता सेवा बनाता है, जिसमें प्रत्येक उपयोगकर्ता को सेवा के रूप में जोड़ा जाता है। जैसा कि आप देख सकते हैं, इस सेवा का नाम security.user.provider.concrete.[name-of-your-firewall] होगा। इसलिए, इस सेवा का उपयोग अपने मतदाता में इस सेवा में शामिल करना या इंजेक्ट करना संभव होना चाहिए। सेवाओं के नाम जानने के लिए और यदि वे बिल्कुल परिभाषित हैं, तो आप हमेशा /app/cache निर्देशिका में डंप किए गए सेवा कंटेनर में एक नज़र डाल सकते हैं।

6

में-स्मृति उपयोगकर्ता प्रदाता सेवा के नाम security.user.provider.concrete.in_memory है, लेकिन सेवा निजी है, इसलिए आप config.yml में इसके लिए एक उपनाम परिभाषित करने की जरूरत:

services: 
    in_memory_user_provider: 
     alias: security.user.provider.concrete.in_memory 

अब, आप in_memory_user_provider के रूप में यह उपयोग कर सकते हैं।

+1

दोनों जवाब समान थे तो मैं पहले एक स्वीकार कर लिया है, लेकिन एक उपनाम का उपयोग करने पर अतिरिक्त जानकारी के लिए धन्यवाद। –

0

सेवा पहले से ही घोषित किया जाता है

<service id="security.user.provider.in_memory" class="Symfony\Component\Security\Core\User\InMemoryUserProvider" abstract="true" />