2011-10-13 9 views
6

मेरे पास ऐसी स्थिति है जहां उपयोगकर्ता को एक सुरक्षित यूआरएल तक पहुंचने का प्रयास करने पर कुछ कोड चलाने की जरूरत है और प्रमाणीकृत/अधिकृत नहीं है।क्या यह देखना संभव है कि फ़ायरवॉल के पीछे प्रोग्रामिंग के माध्यम से कोई यूआरएल/रूट सुरक्षित है या नहीं?

डिफ़ॉल्ट रूप से, सिम्फनी उपयोगकर्ता को लॉगिन फॉर्म में रीडायरेक्ट या अग्रेषित करके अनधिकृत उपयोगकर्ताओं को संभालता है। यदि अनुरोध विधि पोस्ट है, तो मैं इसे रोकने से रोकना चाहता हूं, और इसके बजाय JSON ऑब्जेक्ट को प्रतिबिंबित करता हूं।

  • जांच करता है कि

    • जांच करता है कि अनुरोध विधि है पोस्ट:

      सबसे अच्छा तरीका है मैं इस संभाल करने के बारे में सोच सकते हैं कि kernel.request घटना को सुनता है और दो बातें की जाँच करता है एक कस्टम श्रोता बनाने के लिए है उपयोगकर्ता पूरी तरह

    प्रमाणीकृत यदि यह एक पोस्ट अनुरोध है, और पूरी तरह से उपयोगकर्ता प्रमाणीकृत नहीं है, मैं एक JSON ऑब्जेक्ट गूंज होता है।

    लेकिन मेरा श्रोता (अपेक्षित रूप से) सभी अनुरोधों के लिए फायरिंग है - मैं इसे केवल यह जांचने के लिए सीमित करना चाहता हूं कि अनुरोध फ़ायरवॉल द्वारा संरक्षित यूआरएल के लिए है या नहीं। क्या यह प्रोग्रामिक रूप से जांचना संभव है?

    मैं भी एक सता संदेह है कि इस बारे में जाने के लिए एक सरल तरीका है है, लेकिन यह समझ नहीं है, इसलिए यदि किसी को कोई सुझाव है, मैं उन्हें :)

    संपादित जानकर अच्छा लगेगा
    @Problematic - केवल फ़ायरवॉल अनुरोधों की जांच करने का कारण यह है क्योंकि मेरे पास कुछ अनुरोध हैं जो फ़ायरवॉल नहीं हैं, और यदि मेरा कोड निकाल दिया गया है, तो मुझे अनुरोध की वास्तविक प्रतिक्रिया के बजाय उपरोक्त JSON ऑब्जेक्ट प्राप्त होगा।

    अभी अगर मैं लॉग इन नहीं हूं और api/get/something (जो फ़ायरवॉल के पीछे है) के लिए POST अनुरोध करें, सिम्फनी लॉगिन पृष्ठ का वर्णन करने वाले HTML को वापस लौटाता है। इसके बजाय, मैं सिर्फ {error: 'User is not authorized'} जैसे कुछ गूंजना चाहता हूं। लेकिन मैं केवल POST अनुरोधों के लिए ऐसा करना चाहता हूं।

  • +0

    केवल फ़ायरवॉल अनुरोधों की जांच करने का कारण क्या है? – Problematic

    +0

    @Problematic, कृपया मेरा संपादन –

    उत्तर

    3

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

    इसे ध्यान में रखते हुए, मैं अंतिम परिणाम प्राप्त करने में सक्षम था। यह

    • Symfony\Component\Security\Http\Firewall kernel.request घटना के लिए सुनता है एक बार आपको पता है कि सुरक्षा तंत्र काम करता है बहुत सरल है ...
    • फ़ायरवॉल तो घटना श्रोताओं को security.yml
    • में पंजीकृत हैं किसी भी सुरक्षा उल्लंघन हैं की एक संख्या कॉल (यानी उपयोगकर्ता लॉग इन किए बिना कुछ एक्सेस करने का प्रयास कर रहा है) पता चला है, AccessDeniedException फेंक दिया गया है, और kernel.exception ईवेंट प्रेषित किया गया है।
    • Symfony/Component/Security/Http/Firewall/ExceptionListener घटना के लिए सुनता है और onKernelException विधि को सक्रिय करता है जो तय करता है कि अगला कदम क्या है।मेरे मामले में, यह प्रमाणीकरण प्रक्रिया

    शुरू होगा के बाद से प्रमाणीकरण प्रक्रिया शुरू करने से क्या मैं बचना चाहता था है, मैं अपने ही घटना श्रोता कि kernel.exception को बीच में रोक से पहले Symfony के ExceptionListener करता है लिखा था। मैं अपने घटना श्रोता की 1.

    एक प्राथमिकता दे दी है इस विधि मैंने लिखा है:

    public function handleException(GetResponseForExceptionEvent $event) { 
         $exception = $event->getException(); 
         $request = $event->getRequest(); 
         if ($request->getMethod() == 'POST') { 
          if ($exception instanceof AccessDeniedException) { 
           $response = new Response({err: 'not logged in'}); 
           $event->setResponse($response); 
          } 
         } 
        } 
    

    जब तक उपयोगकर्ता अधिकृत नहीं है के रूप में, और अनुरोध पद्धति POST है, एक JSON ऑब्जेक्ट दिया जाता है (जो ईवेंट पेज के लिए एचटीएमएल की जगह इवेंट प्रोजेक्शन भी रोकता है)। अन्यथा, kernel.exception के अन्य श्रोताओं प्रतिक्रिया देंगे और सिम्फनी अपने व्यापार के बारे में जा सकते हैं।

    तो, मूल प्रश्न अनुत्तरित रहता है, लेकिन मुझे लगता है कि यह जांच कर पूरा किया जा सकता है कि उपयोगकर्ता के पास कोई कार्रवाई है या नहीं। Symfony\Component\Security\Core\Authorization\AccessDecisionManager ऐसा लगता है कि यह इसके लिए सहायक होगा।

    संपादित
    मैं अगर इस विधि केवल उन है कि में। मैं अभी तक यह परीक्षण नहीं किया लॉग इन नहीं हैं संभालती है पता नहीं है, लेकिन मुझे लगता है यह भी अगर एक (प्रवेश) को सक्रिय कर देगा उपयोगकर्ता उस क्रिया को एक्सेस करने का प्रयास करता है जिसके लिए उन्हें एक भूमिका की आवश्यकता नहीं होती है। यदि इससे कोई समस्या आती है, तो मैं इसे Symfony\Component\Security\Core\Authentication\AuthenticationTrustResolver के isFullFledged($token) विधि का उपयोग करने के लिए संशोधित करने का प्रयास करता हूं जो केवल लॉग इन नहीं होने वाले उपयोगकर्ताओं की देखभाल करता है।

    +0

    देखें यदि आप एक जेसन प्रतिक्रिया भेज रहे हैं, तो आपको यह देखने के लिए एक चेक जोड़ना चाहिए कि यह इसका उपयोग कर AJAX अनुरोध है या नहीं: $ request-> isXmlHttpRequest()। यह वही है जो मैंने डिफ़ॉल्ट प्रमाणीकरण विधि को AJAX विधि में बदलने के लिए उपयोग किया था। – HappyDeveloper

    +0

    @Happy डेवलपर टिप के लिए धन्यवाद, लेकिन मैं अभी भी एक नियमित रूप से लॉगिन लॉगिन का उपयोग कर रहा हूँ। संरक्षित कार्यों में कोई POST अनुरोध किया जा रहा था और उपयोगकर्ता लॉग इन नहीं किया गया था, तो मुझे बस अलग-अलग प्रतिक्रिया करने की आवश्यकता थी। –

    संबंधित मुद्दे

     संबंधित मुद्दे