java - Deadbolt 2 和 Play 2.4.x : Null pointer exception on unaccessible pages

标签 java playframework deadbolt deadbolt-2

我正在尝试使用 Deadbolt 2 在 Play Framework 2.4.x 中实现一个简单的身份验证系统。

我已经关注了这个guide由 Chaloner 编写,我已经实现了我的死锁处理程序,如下所示:

public class MyDeadboltHandler extends AbstractDeadboltHandler {

    public F.Promise<Optional<Result>> beforeAuthCheck(Http.Context context) {
        // returning null means that everything is OK.  Return a real result if you want a redirect to a login page or
        // somewhere else
        return F.Promise.promise(Optional::empty);
    }

    public F.Promise<Optional<Subject>> getSubject(Http.Context context) {
        // in a real application, the user name would probably be in the session following a login process
        User user = new User("MyUser", "my.email@info.com");
        return F.Promise.promise(() -> Optional.ofNullable(user));
    }

    public F.Promise<Optional<DynamicResourceHandler>> getDynamicResourceHandler(Http.Context context) {
        return F.Promise.promise(() -> Optional.of(new MyDynamicResourceHandler()));
    }

    @Override
    public F.Promise<Result> onAuthFailure(final Http.Context context, final String content) {
        // you can return any result from here - forbidden, etc
        return F.Promise.promise(() -> Controller.redirect(routes.Application.index()));
    }
}

我的主 Controller 是这样的:

public class Application extends Controller {

    public Result index() {
        return ok(index.render());
    }

    @SubjectPresent
    public Result denyAccess(){
        return ok(notAllowed.render());
    }

    public Result permitAccess(){
        return ok(allowed.render());
    }

    public Result errorPage(){
        return ok(errorPage.render());
    }
}

当我尝试访问由操作 denyAccess 呈现的页面时,会出现此问题。在这种情况下,我在页面上收到 NullPointerException,但没有可以读取的堆栈跟踪,如下图所示。

enter image description here

即使当我尝试访问 Controller denyAccess时,onAuthFailure方法似乎也从未被调用。

可以看到完整的项目here在我的 github 页面上,它很短,我认为它可以帮助您理解问题。

感谢您的帮助。

最佳答案

问题在于您的 HandlerCache 实现:

@Singleton
public class MyHandlerCache implements HandlerCache {

    private final Map<String, DeadboltHandler> handlers = new HashMap<>();

    public MyHandlerCache() {
        handlers.put("DEFAULT_KEY", new MyDeadboltHandler());
    }

    @Override
    public DeadboltHandler apply(final String key) {
        return handlers.get(key);
    }

    @Override
    public DeadboltHandler get() {
        return handlers.get("DEFAULT_KEY");
    }
}

默认情况下,默认处理程序键名称由 be.objectify.deadbolt.java.ConfigKeys.DEFAULT_HANDLER_KEY 定义,但在 MyHandlerCache 中您使用 “DEFAULT_KEY” 。但是,当调用该方法时:

public DeadboltHandler apply(final String key) {
    return handlers.get(key);
}

它将接收 be.objectify.deadbolt.java.ConfigKeys.DEFAULT_HANDLER_KEY 作为 key 并返回 null。

我将确保更好地记录这一点并在文档中明确说明。要修复您的实现,请将 "DEFAULT_KEY" 替换为 be.objectify.deadbolt.java.ConfigKeys.DEFAULT_HANDLER_KEY:

@Singleton
public class MyHandlerCache implements HandlerCache {

    private final Map<String, DeadboltHandler> handlers = new HashMap<>();

    public MyHandlerCache() {
        handlers.put(ConfigKeys.DEFAULT_HANDLER_KEY, new MyDeadboltHandler());
    }

    @Override
    public DeadboltHandler apply(final String key) {
        return handlers.get(key);
    }

    @Override
    public DeadboltHandler get() {
        return handlers.get(ConfigKeys.DEFAULT_HANDLER_KEY);
    }
}

关于java - Deadbolt 2 和 Play 2.4.x : Null pointer exception on unaccessible pages,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35179979/

相关文章:

JAVA - 如何从Annotation获取注解?

java - 如何取消java上的定时器?

java - 多重继承和接口(interface)

java - 限制条件未完全纳入 Play 2.1

java - 如何访问 Deadbolt2 处理程序中的用户 session

java - Android Json查询错误

java - Play 的通用包装方法!楷模

scala - 检查 Play 当前模式会发生错误

java - Play 框架使用 Deadbolt 从 2.1.x 迁移到 2.3.0