2011-11-30 18 views
6

मैं उपयोगकर्ता को HTTP के बजाय HTTPS का उपयोग करने के लिए मजबूर करना चाहता हूं लेकिन प्रमाणीकरण के बाद ही। मुझे मिला एकमात्र विकल्प प्रति नियंत्रक/विधि के आधार पर HTTPS को मजबूर कर रहा है। बेनामी उपयोगकर्ताओं को केवल HTTP का उपयोग करना चाहिए।सिम्फनी 2, प्रमाणीकरण के बाद HTTPS पर स्विच करें

केवल प्रमाणित उपयोगकर्ताओं के लिए बल-HTTPS कैसे सेट करें और मेरे बंडल में सभी नियंत्रकों में अनधिकृत उपयोगकर्ताओं के लिए HTTPS का उपयोग न करें?

फिर से - यह प्राधिकरण पृष्ठ के लिए HTTPS को अक्षम करने के बारे में नहीं है।

मैं प्रमाणीकृत और अनधिकृत उपयोगकर्ताओं के लिए सभी समान नियंत्रकों का उपयोग करना चाहता हूं लेकिन उन लोगों को मजबूर करता हूं जो HTTPS का उपयोग करने के लिए लॉग इन हैं, और जो HTTP का उपयोग नहीं कर रहे हैं। जब उपयोगकर्ता प्रमाणीकृत होता है तो सभी नियंत्रकों के लिए मूल रूप से HTTPS के लिए आवश्यकता जोड़ें।

यह प्रश्न सिम्फनी 2 विशिष्ट है। मैं सिम्फनी तंत्र का उपयोग कर ऐसा करना चाहता हूं। मुझे पता है कि इस चीज़ का पता कैसे लगाया जाए, लेकिन यह ट्विग लिंक तोड़ देगा। सिम्फनी स्वचालित रूप से HTTPS पर स्विच कर सकता है, मैं सिर्फ यह जानना चाहता हूं कि प्रति उपयोगकर्ता भूमिका के आधार पर इसे कैसे नियंत्रित किया जाए, प्रति नियंत्रक आधार पर नहीं।

+0

क्या आपके पास कोई प्रश्न है? – JJJ

+1

प्रमाणीकरण के लिए HTTPS का उपयोग नहीं करना एक बीएडी निर्णय है। इसका मतलब है कि भेजा/प्राप्त डेटा सादा पाठ है, और क्लाइंट और आपके सर्वर के बीच के रूट में किसी भी मशीन तक पहुंचने वाला कोई भी व्यक्ति पैकेट पढ़ने और क्रेडेंशियल्स (उपयोगकर्ता, पास, कुकी इत्यादि) इकट्ठा करने में सक्षम होगा। प्रमाणीकरण के लिए एसएसएल का उपयोग नहीं करने के लिए कोई विशेष कारण है? – jweyrich

+2

@jweyrich यह सवाल नहीं है। मैं चाहता हूं कि उपयोगकर्ता प्राधिकरण के बाद सभी बाद के पृष्ठों के लिए https का उपयोग करे (जो बाहरी बीटीडब्ल्यू है) और अनधिकृत उपयोगकर्ताओं के लिए https अक्षम करें। –

उत्तर

10

एक लगता होगा पहुँच नियंत्रक हमारे लिए इस करना होगा:

access_control: 
    - { role: ROLE_USER, requires_channel: https } 
    - { role: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: http } 

लेकिन, नहीं ... मुझे लगता है कि यह हालांकि एक बहुत अच्छी सुविधा होगी।

उस मामले में, हम एक अनुरोध श्रोता का उपयोग कर गिरी घटनाओं के साथ एक साथ कुछ हैक कर सकते हैं:

namespace YourBundle\EventListener; 

use Symfony\Component\HttpKernel\Event\GetResponseEvent; 
use Symfony\Component\HttpFoundation\RedirectResponse; 

class RequestListener 
{ 
    public function onKernelRequest(GetResponseEvent $event) 
    { 
     $request = $event->getRequest(); 

     // force ssl based on authentication 
     if ($this->container->get('security.context')->isGranted('IS_AUTHENTICATED_FULLY')) { 
      if (!$request->isSecure()) { 
       $request->server->set('HTTPS', true); 
       $request->server->set('SERVER_PORT', 443); 
       $event->setResponse(new RedirectResponse($request->getUri())); 
      } 
     } else { 
      if ($request->isSecure()) { 
       $request->server->set('HTTPS', false); 
       $request->server->set('SERVER_PORT', 80); 
       $event->setResponse(new RedirectResponse($request->getUri())); 
      } 
     } 
    } 
} 

सेवाओं के तहत config.yml में अपने श्रोता को परिभाषित करें:

myapp.request.listener: 
    class: MyApp\MyBundle\EventListener\RequestListener 
    tags: 
     - { name: kernel.event_listener, event: kernel.request } 

पर जानकारी के लिए Symfony Internals देखें घटनाओं और पसंद है।

+1

आप हमारे बंडल की जांच कर सकते हैं जो स्वचालित व्यवहार को उपयोगकर्ताओं में लॉग इन करने के लिए एसएसएल को मजबूर करने की अनुमति देता है, अगर वे बिना किसी https के साइट पर पहुंचते हैं तो 403 देने के बिना: https://github.com/nelmio/NelmioSecurityBundle – Seldaek

2

सिम्फनी 2.0.11 में मुझे एक पुनर्निर्देशन त्रुटि मिलती है। इसे हल करने के लिए मैंने श्रोता में निम्नलिखित पंक्तियों पर टिप्पणी की है।

class RequestListener { 
    public function onKernelRequest(GetResponseEvent $event) { 
     $request = $event->getRequest(); 

     // force ssl based on authentication 
     if  ($this->container->get('security.context')->isGranted('IS_AUTHENTICATED_FULLY')) { 
      if (!$request->isSecure()) { 
       $request->server->set('HTTPS', true); 
       $request->server->set('SERVER_PORT', 443); 
       // $event->setResponse(new RedirectResponse($request->getUri())); 
      } 
     } else { 
      if ($request->isSecure()) { 
       $request->server->set('HTTPS', false); 
       $request->server->set('SERVER_PORT', 80); 
       // $event->setResponse(new RedirectResponse($request->getUri())); 
      } 
     } 
    } 
}