2011-09-14 10 views
21

के साथ लॉगिन के लिए एचटीपीएस रूटिंग लागू करें मैं केवल अपने आवेदन के लॉगिन पेज के लिए https रूटिंग को लागू करना चाहता हूं।प्ले फ्रेमवर्क

क्या Play के साथ ऐसा करना संभव है! फ्रंट एंड http सर्वर के उपयोग के बिना?

+2

हमेशा क्यों है कि किसी एक प्ले ढांचे से संबंधित सवाल ही नहीं 1.x और 2.x संस्करणों के लिए जवाब हैं पूछता है? यह देखते हुए कि वे इतने अलग हैं कि यह सिर्फ भ्रम का कारण बनता है, अगर अलग-अलग नामों के साथ नामित किया गया था ... जैसे 'प्ले' और 'रन' की तरह। –

+0

हर किसी ने Play को बताया! जब उन्होंने 2.0 लॉन्च किया तो इसे टीम बनाएं। उन्होंने नहीं सुनी। – HelpMeStackOverflowMyOnlyHope

उत्तर

21

आप प्रत्येक अनुरोध को पुनर्निर्देशित करने के लिए @Before इंटरसेप्टर का उपयोग कर सकते हैं, भले ही उपयोगकर्ता http: // सीधे टाइप करता हो। नीचे वह कोड है जिसका मैं उपयोग करता हूं (यह कंटेनरलेस play run चलाते समय काम करता है, या जब हेरोोकू जैसे फ्रंट एंड के पीछे दौड़ता है)।

public class HttpsRequired extends Controller { 
    /** Called before every request to ensure that HTTPS is used. */ 
    @Before 
    public static void redirectToHttps() { 
     //if it's not secure, but Heroku has already done the SSL processing then it might actually be secure after all 
     if (!request.secure && request.headers.get("x-forwarded-proto") != null) { 
      request.secure = request.headers.get("x-forwarded-proto").values.contains("https"); 
     } 

     //redirect if it's not secure 
     if (!request.secure) { 
      String url = redirectHostHttps() + request.url; 
      System.out.println("Redirecting to secure: " + url); 
      redirect(url); 
     } 
    } 

    /** Renames the host to be https://, handles both Heroku and local testing. */ 
    @Util 
    public static String redirectHostHttps() { 
     if (Play.id.equals("dev")) { 
      String[] pieces = request.host.split(":"); 
      String httpsPort = (String) Play.configuration.get("https.port"); 
      return "https://" + pieces[0] + ":" + httpsPort; 
     } else { 
      if (request.host.endsWith("domain.com")) { 
       return "https://secure.domain.com"; 
      } else { 
       return "https://" + request.host; 
      } 
     } 
    }  
} 
+0

आप कमाल हैं! –

2

आपको सक्षम होना चाहिए। निम्न कार्य करें:

  1. सेट करें http.port और application.config फ़ाइल में https.port
  2. उपयोगकर्ता @@ {Controller.action() सुरक्षित()।} आप एक सुरक्षित करने के लिए बात करने के लिए की जरूरत है जब पृष्ठ। दोनों @@ (HTTPS सहित) एक पूर्ण यूआरएल उत्पन्न करने के लिए और सुरक्षित आप HTTPS प्रोटोकॉल

चाहते हैं तो यह

+2

क्या होगा अगर उपयोगकर्ता पता बार में यूआरएल http: //myapp.org/login https: //myapp.org/login के बजाय टाइप करता है। मुझे जो चाहिए वह नियंत्रक लॉगिन() से ही एक https पुनर्निर्देशन होगा। – emt14

0

यह देखने के नियंत्रक बिंदु से संभव हो सकता है नहीं लगता है काम करना चाहिए खेलने के लिए संकेत करने के लिए। टेम्पलेट पेरे समाधान से काम करता है लेकिन यह केवल टेम्पलेट से https url उत्पन्न करता है।

यदि उपयोगकर्ता या तो मैन्युअल रूप से टाइप करके या http url के लिंक का पालन करके लॉगिन कार्रवाई का उपयोग करता है, तो https को लागू/पुनर्निर्देशित करने का कोई तरीका प्रतीत नहीं होता है।

सबसे अच्छा तरीका सामने वाला प्रॉक्सी लगता है।

+0

ऐसा करने के लिए वास्तव में कई तरीके हैं जैसा कि आप अन्य उत्तरों में देख सकते हैं –

3

मुझे लगता है कि आप request.secure == सत्य के लिए नियंत्रक में जांच सकते हैं और फिर https पर रीडायरेक्ट कर सकते हैं।

+0

आपने दिमाग में 1.x प्ले किया है? मुझे Play 2.2 में कोई भी request.secure' फ़ील्ड नहीं मिल रहा है। – KajMagnus

+1

'request.sequre' जून 2014 में जारी प्ले 2.3 में उपलब्ध है, एपीआई दस्तावेज़ देखें: http://www.playframework.com/documentation/2.3.x/api/scala/index.html#play.api। mvc.RequestHeader – KajMagnus

6

यहां एक उदाहरण है जो जावा प्ले 2.1.1 और हेरोकू के साथ काम करता है।

public class ForceHttps extends Action<Controller> { 

    // heroku header 
    private static final String SSL_HEADER = "x-forwarded-proto"; 

    @Override 
    public Result call(Context ctx) throws Throwable { 
     final Result result; 
     if (Play.isProd() && !isHttpsRequest(ctx.request())) { 
      result = redirect("https://" + ctx.request().host() 
        + ctx.request().uri()); 
     } 
     else { 
      // let request proceed 
      result = this.delegate.call(ctx); 
     } 
     return result; 
    } 

    private static boolean isHttpsRequest(Request request) { 
     // heroku passes header on 
     return request.getHeader(SSL_HEADER) != null 
       && request.getHeader(SSL_HEADER) 
         .contains("https"); 
    } 

} 

फिर किसी भी नियंत्रक को आप https के लिए जांचना चाहते हैं, @With (ForceHttps.class) जोड़ें। या यदि आप सभी नियंत्रकों को जांचना चाहते हैं, तो एक वर्ग जोड़ें HttpsController नियंत्रक को बढ़ाता है और आपके सभी वर्ग HttpsController का विस्तार करते हैं।

उदा।

@With(ForceHttps.class) 
public class HttpsController extends Controller { 

} 
+1

यह 2.5 पर मेरे लिए किसी भी समस्या के बिना काम करता है, केवल अंतर यह है कि कॉल विधि का रिटर्न प्रकार अब CompletionStage है, ताकि आप रीडायरेक्ट Future.completedFuture का उपयोग रीडायरेक्ट को वापस करने के लिए कर सकें। – jyoung

3

यदि आपका एडब्ल्यूएस उपयोग कर, आप लोड बैलेंसर पर अपनी HTTPS समाप्त और HTTPS करने के लिए HTTP कनेक्शन पुनर्निर्देशित करने के लिए एक फिल्टर का उपयोग कर सकते हैं।

एडब्ल्यूएस सम्मेलन:

443 (लोड बैलेंसर) ----------> 80 (सर्वर)

80 (लोड बैलेंसर) ---------- > 80 (सर्वर)

फिल्टर:

object HTTPSRedirectFilter extends Filter with Logging { 

    def apply(nextFilter: (RequestHeader) => Future[SimpleResult])(requestHeader: RequestHeader): Future[SimpleResult] = { 
     //play uses lower case headers. 
     requestHeader.headers.get("x-forwarded-proto") match { 
      case Some(header) => { 
       if ("https" == header) { 
        nextFilter(requestHeader).map { result => 
         result.withHeaders(("Strict-Transport-Security", "max-age=31536000")) 
        } 
       } else { 
        Future.successful(Results.Redirect("https://" + requestHeader.host + requestHeader.uri, 301)) 
       } 
      } 
      case None => nextFilter(requestHeader) 
     } 
    } 
} 

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

  • कोई संबंधित समस्या नहीं^_^