2011-09-22 4 views
7

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

मेरे उपयोगकर्ता ऑब्जेक्ट में getRoles() विधि डेटाबेस से भूमिका वस्तुएं प्राप्त करती है और इसे तारों की सरणी में बदल देती है, भूमिका के नाम मेरे डेटाबेस से आते हैं और सभी ROLE_ से शुरू होते हैं।

यदि मैं किसी ऐसे खाते से लॉगिन करता हूं जिसमें कोई अतिरिक्त भूमिका नहीं होनी चाहिए तो यह ठीक काम करता है, लेकिन अगर मैं ऐसे खाते में लॉगिन करता हूं जिसमें भूमिकाएं होनी चाहिए तो मुझे बिना किसी त्रुटि संदेश के लॉगिन स्क्रीन पर वापस भेज दिया जाएगा।

मैं लॉग की जाँच की और इन प्रविष्टियों को देखा है:

security.INFO: User "[email protected]" has been authenticated successfully [] [] 
event.DEBUG: Notified event "security.interactive_login" to listener "Pogo\MyBundle\Listener\LoginListener::onSecurityInteractivelogin". [] [] 
event.DEBUG: Listener "Symfony\Component\Security\Http\Firewall::onKernelRequest" stopped propagation of the event "kernel.request". [] [] 
event.DEBUG: Listener "Symfony\Bundle\FrameworkBundle\EventListener\RouterListener" was not called for event "kernel.request". [] [] 
event.DEBUG: Listener "Symfony\Bundle\AsseticBundle\EventListener\RequestListener" was not called for event "kernel.request". [] [] 
event.DEBUG: Notified event "kernel.response" to listener "Symfony\Component\Security\Http\Firewall\ContextListener::onKernelResponse". [] [] 
security.DEBUG: Write SecurityContext in the session [] [] 
event.DEBUG: Notified event "kernel.response" to listener "Symfony\Component\HttpKernel\EventListener\ResponseListener::onKernelResponse". [] [] 
event.DEBUG: Notified event "kernel.response" to listener "Symfony\Bundle\SecurityBundle\EventListener\ResponseListener::onKernelResponse". [] [] 
event.DEBUG: Notified event "kernel.response" to listener "Symfony\Bridge\Monolog\Handler\FirePHPHandler::onKernelResponse". [] [] 
event.DEBUG: Notified event "kernel.response" to listener "Sensio\Bundle\FrameworkExtraBundle\EventListener\CacheListener::onKernelResponse". [] [] 
event.DEBUG: Notified event "kernel.response" to listener "Symfony\Component\HttpKernel\EventListener\ProfilerListener::onKernelResponse". [] [] 
event.DEBUG: Notified event "kernel.response" to listener "Symfony\Bundle\WebProfilerBundle\EventListener\WebDebugToolbarListener::onKernelResponse". [] [] 
event.DEBUG: Notified event "kernel.request" to listener "Symfony\Bundle\FrameworkBundle\EventListener\RouterListener::onEarlyKernelRequest". [] [] 
event.DEBUG: Notified event "kernel.request" to listener "Symfony\Bundle\FrameworkBundle\EventListener\SessionListener::onKernelRequest". [] [] 
event.DEBUG: Notified event "kernel.request" to listener "Symfony\Component\Security\Http\Firewall::onKernelRequest". [] [] 
security.INFO: Populated SecurityContext with an anonymous Token [] [] 
event.DEBUG: Notified event "kernel.exception" to listener "Symfony\Component\Security\Http\Firewall\ExceptionListener::onKernelException". [] [] 
security.DEBUG: Access denied (user is not fully authenticated); redirecting to authentication entry point [] [] 
security.DEBUG: Calling Authentication entry point [] [] 

मैं जैसे ही यह फ़ायरवॉल यह एक गुमनाम टोकन के माध्यम से ही पाता है की जाँच करता है समझ में नहीं आता कि यह कैसे शीर्ष पर प्रमाणीकृत किया जा सकता है, तो यही कारण है कि यह संभवतः मुझे वापस लॉगिन स्क्रीन पर भेजता है।

मेरे फ़ायरवॉल/access_control सेटिंग्स हैं:

firewalls: 
    public: 
     pattern: /.* 
     anonymous: true 
     tessitura_login: 
      login_path: /account/login 
      check_path: /secure/login_check 
     logout: 
      path: /secure/logout 
      target:/
access_control: 
    - { path: ^/secure/.*, role: ROLE_USER } 
    - { path: ^/admin.*, role: ROLE_ADMIN } 
    - { path: ^/account/login/?, role: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: /.*, role: IS_AUTHENTICATED_ANONYMOUSLY } 

इस के साथ किसी भी मदद की व्यापक सराहना की जाएगी, मैं अब इस पर कुछ घंटे बिताए और पूरी तरह से स्टंप्डया हूं।

+1

मुझे नहीं लगता कि आपको अपनी समस्या का उत्तर मिल गया है? – Clint

+2

क्षमा करें क्लिंट, शायद आपके लिए थोड़ा देर हो चुकी है लेकिन यह पता चला कि सत्र क्षेत्र बहुत छोटा था। कोड सत्र में काफी सारे डॉक्टर ऑब्जेक्ट्स को संग्रहीत कर रहा था जो इस त्रुटि के कारण डेटाबेस फ़ील्ड में फिट नहीं होगा – pogo

उत्तर

0

मैंने इसका अनुभव किया है। मैं में मेरी उन लॉग की जांच जब क्या भूमिका वह इस तरह के बयानों के एक जोड़े के साथ है: समय पर

if(true === $this->get('security.context')->isGranted('ROLE_MANAGER')){ 
    //return redirect 
} 
if(true === $this->get('security.context')->isGranted('ROLE_USER')){ 
    //return redirect 
} 
//throw error 

समय कुछ उपयोगकर्ताओं को उनके चेहरे में फेंक दिया कोई त्रुटि मिलती है। मुझे कल्पना है कि यह एक ही कारण से है। उपयोगकर्ता किसी भी तरह प्रमाणित है लेकिन उनकी भूमिका नहीं मिली है।

मैं अपनी समस्या को पुन: उत्पन्न नहीं कर सकता। मैंने अभी अपने उपयोगकर्ताओं से त्रुटि रिपोर्ट सुनी है।

0

मैंने इसका अनुभव किया है। और मेरे लिए ऐसा इसलिए था क्योंकि/tmp विभाजन पूर्ण हो गया था, इसलिए सत्र सर्वर की तरफ स्टोर किया जा सकता है और नेक्स

1

पर एक बार टूटा सत्र भंडारण मेरे लिए कारण बनता है। मैं PdoSessionHandler का उपयोग कर रहा था और निराशाजनक रूप से यह कोई स्पष्ट त्रुटि या लॉग संदेश नहीं दिया।

0

मैंने अपने सिस्टम में लॉग इन करते समय एक ही समस्या का अनुभव किया जहां सत्रों को memcache में संग्रहीत करने के लिए कॉन्फ़िगर किया गया है लेकिन memcached नहीं चल रहा था। दुर्भाग्यवश ऊपर बताए अनुसार यह कोई बेहतर त्रुटि संदेश नहीं दिया।

आशा है कि किसी को कुछ समय ;-)

0

मैं मैं सोनाटा व्यवस्थापक बंडल का इस्तेमाल किया है और मैं भी PdoSessionHandler

session.handler.pdo: 
    class:  Symfony\Component\HttpFoundation\Session\Storage\Handler\PdoSessionHandler 
    arguments: ["@pdo", %pdo.db_options%] 
साथ डेटाबेस सत्र का उपयोग किया गया था उपयोगकर्ता लॉगिन के साथ एक ही मुद्दा था बचाने के लिए मदद करता है

सबसे पहले इस मुद्दे को मैं मिला जब मैं भूमिकाओं/अनुमतियों के बहुत कुछ के साथ एक समूह बनाने के डेटा क्षेत्र में छोटा कर दिया तो मैं longtext के साथ मेरी भूमिकाओं क्षेत्र में परिवर्तन और ROW_FORMAT=COMPRESSED

ALTER TABLE `fos_group` CHANGE `roles` `roles` LONGTEXT NOT NULL COMMENT '(DC2Type:array)'; 
ALTER TABLE `fos_group` 
    ENGINE=INNODB 
    ROW_FORMAT=COMPRESSED 
    KEY_BLOCK_SIZE=8; 
बदल

यह काम करता है और सभी भूमिकाओं को बचाने/क्षेत्र के रूप में पूरा धारावाहिक string.But उपयोगकर्ता कोई त्रुटि संदेश तब मैं app/logs dir में सिम्फोनी द्वारा उत्पन्न लॉग की समीक्षा यह

है है के साथ प्रवेश करने में असमर्थ था में अनुमतियाँ

उपयोगकर्ता को सफलतापूर्वक प्रमाणीकृत किया गया है

और फिर डैशबोर्ड पर, लेकिन जैसा कि

पहुँच से मना कर उत्पन्न लॉग डैशबोर्ड से अनुप्रेषित (उपयोगकर्ता च नहीं है ully प्रमाणीकृत)

कारण था सत्र डेटा सत्र तालिका में दिया जाता है तो मैं रूप में अच्छी तरह मेरी सत्र तालिका में परिवर्तन और इस काम

ALTER TABLE `session` CHANGE `session_value` `session_value` LONGTEXT NOT NULL; 
ALTER TABLE `session` 
    ENGINE=INNODB 
    ROW_FORMAT=COMPRESSED 
    KEY_BLOCK_SIZE=8; 

मैं भी my.ini फ़ाइल अद्यतन और बदल दिया है करता है डिफ़ॉल्ट फ़ाइल स्वरूप द्वारा बाराकुडा करने के लिए फ़ाइल स्वरूप antelop

[mysqld] 
innodb_file_per_table 
innodb_file_format = Barracuda 
2

इस मूक असफल मुद्दा जब उपयोगकर्ता नाम के रूप फ़ोन नंबर का उपयोग किया गया था औरमें उपयोगकर्ता नाम संपत्ति निर्दिष्ट नहीं किया समझे हैविधि है, जो होना चाहिए:

public function refreshUser(UserInterface $customer) 
{ 
    $class = get_class($customer); 

    if(!$this->supportsClass($class)) { 
     throw new UnsupportedUserException("Instances of \"{$class}\" are not supported"); 
    } 

    return $this->loadUserByUsername($customer->getPhoneNumber()); // <-- This is it! 
} 

मुझे लगता है कि मैं केवल एक है जो इसे याद नहीं कर रहा हूँ, मदद कर सकता है।