Bre*_*ett 4 java authorization playframework playframework-2.4
我正在使用play framework 2.4.2Java,我想通过拦截所有请求并检查是否设置了会话值来验证用户是否已登录.所以我扩展了DefaultHttpRequestHandler并重写了createActionMethod以拦截所有请求.但是,我还没有找到一种验证会话的好方法.
当我尝试获取会话值时,我得到一个运行时异常: 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
}
}
Run Code Online (Sandbox Code Playgroud)
由于会话在技术上是一个cookie,我可以从头部检索值,如下所示:
for(String cookie : request.headers().get("Cookie")){
System.out.println("cookie: "+cookie);
}
Run Code Online (Sandbox Code Playgroud)
但是我必须解析看起来像以下行的cookie字符串以获取loggedIn值.为了我的口味弄脏.
_ga=GA1.1.1508004144.1421266376; ki_r=; ki_t=1438789543788%378129908%3B1438789543788%3B1%3B1; PLAY_SESSION=0570411c3eb55ad230681539ddcfaa4220583fd-loggedIn=1
Run Code Online (Sandbox Code Playgroud)
我注意到一些网站记录了一种不同的方法,而是创建了一个
动作组合,并为每个控制器类或方法添加了适当的注释.
这种方法的问题是它需要开发人员记住添加注释.我宁愿颠倒它以默认阻止每个路由,然后向不需要验证的路由添加注释.
一些记录行动构成的网站:
有没有办法全局验证用户是否应该访问页面以及如何获取会话变量?
*请注意,我对使用第三方插件进行身份验证不感兴趣.
即使我重新考虑使用动作合成,您也可以修复选项1.
创建自定义注释以标记不需要验证的操作.
@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
public @interface NoAuthRequired {}
Run Code Online (Sandbox Code Playgroud)
然后更改您的HttpRequestHandler实现.
public class RequestHandler extends DefaultHttpRequestHandler {
@Override
public Action createAction(Http.Request request, Method actionMethod) {
return new Action.Simple() {
@Override
public F.Promise<Result> 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"));
}
}
};
}
}
Run Code Online (Sandbox Code Playgroud)
这样,除非明确注释,否则每个路由都需要验证.
从代码中可以看出,会话可以通过Context获得.
| 归档时间: |
|
| 查看次数: |
1968 次 |
| 最近记录: |