2011-08-17 91 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