2011-08-17 86 views
21

我目前在使用Play! 1.2.2及其新的Netty客戶端框架。強制啓用SSL!框架

雖然可以使HTTP和HTTPS異步服務,但我還沒有找到實施SSL的直接方法。有沒有人與Play一起工作!有一個直接的方法來執行SSL?不知道是否需要創建重定向,或者是否可以在conf文件中快速解決。

回答

22

有幾種強制執行SSL的方法。

首先,你可以設置你所有的行動,使用.secure()方法,例如

<a href="@{Application.index.secure()}">index page</a> 

或者,也可能是最好的辦法,就是通過前端HTTP服務器要做到這一點,比如Apache,Nginx的或Lighttpd。

前端http服務器的想法是,您的應用程序運行在端口9000上,但不能從外部網絡訪問。 HTTP負責所有傳入的請求,並被配置爲只接受HTTPS。 HTTP服務器處理HTTPS,然後將請求轉發到Play。

這會使您的整個Play應用程序正常工作,並將SSL卸載到另一個應用程序。

同樣的方法可以應用於負載均衡器,而不是HTTP服務器,但我猜測大多數人會使用HTTP服務器的更便宜的替代方案,除非在公司環境中運行。

+0

非常有幫助,我讚賞多種方法的考慮。 – crockpotveggies

12

在控制器中,您可以檢查request.secure並執行重定向或返回403 /拒絕訪問。

您可以強制SSL整整控制器這樣:

public static class ForceSSL extends Controller 
{ 
    @Before 
    static void verifySSL() 
    { 
     if (request.secure == false) 
      redirect("https://" + request.host + request.url); 
    } 
} 

...和註釋另一個控制器:

@With(ForceSSL.class) 
public class Foo extends Controller 
{ 
.... 
} 

參見http://groups.google.com/group/play-framework/browse_thread/thread/7b9aa36be85d0f7b

+1

如果使用heroku,此代碼將導致「太多重定向」。使用這裏的類似代碼:http://stackoverflow.com/questions/7415030/enforce-https-routing-for-login-with-play-framework – seePatCode