gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 07:37:28 26 4
gpt4 key购买 nike

我正在尝试使用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com