在playframework中拦截请求和检查授权

我正在使用Java play framework 2.4.2 ,我想通过拦截所有请求并检查是否设置了会话值来validation用户是否已登录。 所以我扩展了DefaultHttpRequestHandler并重写了createAction方法来拦截所有请求。 但是,我还没有找到一种validation会话的好方法。

选项1 – 失败

当我尝试获取会话值时,我得到一个运行时exception: There is no HTTP Context available from here

以下是我正在使用的课程:

 public class RequestHandler extends DefaultHttpRequestHandler { @Override public Action createAction(Http.Request request, Method method) { session("loggedIn"); // Throws runtime Exception: no HTTP Context } } 

选项2 – 丑陋

由于会话在技术上是一个cookie,我可以从头部检索值,如下所示:

 for(String cookie : request.headers().get("Cookie")){ System.out.println("cookie: "+cookie); } 

但后来我必须解析看起来像以下行的cookie字符串以获取loggedIn值。 为了我的口味弄脏。

 _ga=GA1.1.1508004144.1421266376; ki_r=; ki_t=1438789543788%378129908%3B1438789543788%3B1%3B1; PLAY_SESSION=0570411c3eb55ad230681539ddcfaa4220583fd-loggedIn=1 

选项3 – 太容易忘记注释

我注意到一些网站记录了不同的方法,而是创建了一个
动作合成并为每个控制器类或方法添加适当的注释。

这种方法的问题是它需要开发人员记住添加注释。 我宁愿颠倒它以默认阻止每个路由,然后向不需要validation的路由添加注释。

一些记录行动构成的网站:

  1. http://alexgaribay.com/2014/06/16/authentication-in-play-framework-using-java/
  2. https://www.playframework.com/documentation/2.2.1/JavaGuide4

有没有办法全局validation用户是否应该访问页面以及如何获取会话变量?

*请注意,我对使用第三方插件进行身份validation不感兴趣。

即使我会重新考虑使用动作合成,您也可以修复选项1。

创建自定义注释以标记不需要validation的操作。

 @Target({ ElementType.TYPE, ElementType.METHOD }) @Retention(RetentionPolicy.RUNTIME) public @interface NoAuthRequired {} 

然后更改您的HttpRequestHandler实现。

 public class RequestHandler extends DefaultHttpRequestHandler { @Override public Action createAction(Http.Request request, Method actionMethod) { return new Action.Simple() { @Override public F.Promise call(Http.Context ctx) throws Throwable { // if the action is annotated with @NoAuthRequired or user is logged in delegate to it if (actionMethod.isAnnotationPresent(NoAuthRequired.class) || ctx.session().containsKey("loggedIn")) { return delegate.call(ctx); } // otherwise, block access else { return F.Promise.pure(forbidden("You're not allowed")); } } }; } } 

这样,除非明确注释,否则每条路径都需要validation。

从代码中可以看出,会话可以通过Context获得。