2013-07-23 3 views
9

मैंने अभी SensioLabsInsight की खोज की और अच्छी कोड लिखने के लिए बहुत interesting tips पाया। यह बहुत अच्छा होगा अगर कुछ स्पष्टीकरण क्यों किया गया था (या क्यों नहीं) कुछ उपयोग किया जाना चाहिए - यहां तक ​​कि exit और die जैसी बुनियादी सामग्री के लिए भी। इससे मुझे उन लोगों को चीजों को समझाने में मदद मिलेगी जिनके साथ मैं काम करता हूं।Symfony2 में निषिद्ध प्रतिक्रिया कैसे बनाएं?

तो मेरे सवाल का विशेष रूप से AccessDeniedHttpException के लिए है - यह कहते हैं:

Symfony अनुप्रयोगों AccessDeniedHttpException

फेंक नहीं करना चाहिए

तो मैं कैसे वापसी करते 403 आवेदन नियंत्रक या EventListener से निषिद्ध?
सबसे अच्छा अभ्यास क्या है?

ईमानदारी से कहूं तो मैंने सोचा कि यह होगा

throw new AccessDeniedHttpException() 

के बाद से 404 के लिए आप

throw $this->createNotFoundException() 

है लेकिन ऐसा लगता है कि मैं गलत था। (?)

उत्तर

0

यहाँ देख रहे हैं http://symfony.com/doc/current/cookbook/security/custom_authentication_provider.html ऐसा लगता है कि एक AuthenticationException जो एक 403 प्रतिक्रिया देता है फेंकने के लिए सक्षम हो सकता है लगता है

+1

ठीक है, मेरे मामले में यह 403 वापस नहीं आता है, लेकिन लॉगिन पृष्ठ पर रीडायरेक्ट करता है। लेकिन क्योंकि मैं एपीआई बना रहा हूं, मुझे 403 की आवश्यकता है। मुझे अब यह कहने का व्यवहार है: 'वर्तमान प्रतिक्रिया स्थिति कोड 200 है, लेकिन 403 अपेक्षित है। –

+0

ठीक है, आप मैन्युअल रूप से इस तरह की प्रतिक्रिया वापस कर सकते हैं: // वापसी एक '403 निषिद्ध' HTTP प्रतिक्रिया $ प्रतिक्रिया = नया प्रतिक्रिया(); $ प्रतिक्रिया-> सेटस्टैटसकोड (403); $ घटना-> सेट रेस्पॉन्स ($ प्रतिक्रिया); लेकिन मुझे नहीं पता कि यह आपके विशेष मामले में लागू है या नहीं। – Tocacar

-3

यहाँ नियंत्रक :: createNotFoundException है() कार्यान्वयन:

public function createNotFoundException($message = 'Not Found', \Exception $previous = null) 
{ 
    return new NotFoundHttpException($message, $previous); 
} 

यह एक फेंकता थोड़ा अलग अपवाद।

मुझे इस टिप का कारण पता नहीं है। शायद इसकी वजह यह है कि नियंत्रक या घटना श्रोता में आप सीधे अपवाद फेंकने के बिना प्रतिक्रिया वापस कर सकते हैं और इस प्रकार अन्य घटना श्रोताओं को ट्रिगर कर सकते हैं।

सिम्फनी event listeners to handle exceptions का उपयोग करता है। आप अपने स्वयं के श्रोताओं को बना सकते हैं और प्रतिक्रिया का प्रबंधन कर सकते हैं। एपीआई के लिए उपयोगी हो सकता है। उदाहरण के लिए मैंने देव पर्यावरण में सुंदर जेसन प्रतिक्रियाओं को वापस करने के लिए इसका उपयोग किया है (स्टैक ट्रेस और अतिरिक्त डीबगिंग जानकारी के साथ)।

+0

मुझे इस टिप के कारण भी नहीं दिख रहे हैं। मेरे एपीआई एप्लिकेशन में वर्तमान में 2 इवेंट श्रोताओं हैं, पहले ओथ 2 एक्सेस टोकन की जांच कर रहा है और अमान्य होने पर 'अनधिकृत एचटीपीएक्सप्शन' => 401 फेंकता है, दूसरा उपयोगकर्ता की अनुमति देता है और 'AccessDeniedHttpException' => 403 फेंकता है। और यह वास्तव में अच्छा काम कर रहा है। तो मुझे लगता है कि टिप गलत है। –

19

मुझे लगता है कि इसका मतलब है कि आपको सीधे AccessDeniedHttpException फेंकने के बजाय AccessDeniedException फेंकना होगा।

मुख्य कारण यह है कि AccessDeniedException इवेंट श्रोता द्वारा Symfony\Component\Security\Http\Firewall\ExceptionListener में कैच किया जाता है और फिर आप इसके साथ कुछ सामान बना सकते हैं। onKernelException फ़ंक्शन देखें।

4

उस वाक्य को सिम्फनी के पूरे आर्किटेक्चर के साथ दिमाग में माना जाना चाहिए।

सिम्फनी ढांचे में एक संपूर्ण subsystem 2 चरण प्रमाणीकरण + प्राधिकरण प्रक्रिया लागू करने वाली सुरक्षा के लिए समर्पित है। सिम्फनी के आर्किटेक्चर में Controllers, जो मूल रूप से ढांचे को विकसित करने के लिए आपको छोड़ देता है और इसलिए वे "एप्लिकेशन" हैं, केवल तभी बुलाया जाएगा जब प्रमाणीकरण + प्रमाणीकरण पारित किया गया हो।

तो वाक्य यह कहता है कि आपको उस अपवाद को फेंकने की आवश्यकता नहीं है जो सुरक्षा घटक के लिए काम है।ऐसा करना कि यह वर्जित नहीं है या यहां तक ​​कि असंभव भी है, लेकिन यह तरीका नहीं है कि ढांचे को आम तौर पर काम करने के लिए सोचा गया है।

यह दो स्थितियों में हो सकता है:

  1. आपका आवेदन विशेष है और आप इस तरह
  2. आप कर के ढांचे के रास्ते से बाहर सुरक्षा काम कर रहे करने की जरूरत है। यह आपकी पसंद है, ढांचे की सुविधाओं का उपयोग न करने और अपने स्वयं के लिखने के लिए लागत/लाभ का मूल्यांकन करें।
संबंधित मुद्दे