Security 为使用play framework登录强制Https路由

Security 为使用play framework登录强制Https路由,security,login,routing,https,playframework,Security,Login,Routing,Https,Playframework,我只想对我的应用程序的登录页面强制https路由 有没有可能这样做与发挥!如果不使用前端http服务器,您应该能够。请执行以下操作: 在application.config文件中设置http.port和https.port 当您需要指向安全页面时,用户@{Controller.action().secure()}。使用@@生成完整的url(包括https)和安全提示来播放您想要的https协议 这应该可以从控制器的角度来看,这似乎是不可能的。从模板Pere解决方案可以工作,但这仅从模板生成htt

我只想对我的应用程序的登录页面强制https路由


有没有可能这样做与发挥!如果不使用前端http服务器,您应该能够。请执行以下操作:

  • 在application.config文件中设置http.port和https.port
  • 当您需要指向安全页面时,用户@{Controller.action().secure()}。使用@@生成完整的url(包括https)和安全提示来播放您想要的https协议

  • 这应该可以

    从控制器的角度来看,这似乎是不可能的。从模板Pere解决方案可以工作,但这仅从模板生成https url

    如果用户通过手动键入或跟随指向http url的链接来访问登录操作,则似乎没有强制/重定向到https的方法


    最好的方法似乎是使用前端代理。

    我认为您可以在控制器中检查请求。secure==true,然后重定向到https。

    您可以使用
    @Before
    拦截器重定向每个请求,即使用户直接键入http://也是如此。下面是我使用的代码(当运行无容器
    play run
    时,或者在前端(例如在Heroku上)后运行时,它会起作用)


    下面是一个使用Java Play 2.1.1和Heroku的示例

    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");
        }
    
    }
    

    如果您正在使用AWS,您可以在负载平衡器处终止HTTPS,并使用筛选器将HTTP连接重定向到HTTPS

    AWS形态:

    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)
            }
        }
    }
    

    如果用户在地址栏中键入url http://myapp.org/login而不是https://myapp.org/login,该怎么办。我需要的是控制器登录()本身的https重定向?我在Play 2.2中找不到任何
    请求。secure
    字段。
    请求。sequre
    在Play 2.3中提供,于2014年6月发布,请参阅API文档:实际上有几种方法可以完成此任务,正如您在其他回答中所看到的那样。为什么总是有人问与Play框架相关的问题1.x和2.x版本有答案?考虑到它们如此不同,这只会引起混乱,如果只是用不同的名称命名。。。比如
    Play
    Run
    也许吧。每个人都说了这出戏!当他们推出2.0时,这个团队就是这样的。他们没有听。这在2.5上对我来说没有任何问题,唯一的区别是调用方法的返回类型是now CompletionStage,因此可以使用CompletableFuture.completedFuture返回重定向。
    @With(ForceHttps.class)
    public class HttpsController extends Controller {
    
    }
    
    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)
            }
        }
    }