0

I am trying to integrate Deadbolt into my application. I have faced the issue and don't know what to do with it. When I go to the restricted page annotated with: @Restrict(@Group("admin")) the program throws following exception:

play.api.http.HttpErrorHandlerExceptions$$anon$1: Execution exception[[RuntimeEx
ception: java.lang.NullPointerException]]
        at play.api.http.HttpErrorHandlerExceptions$.throwableToUsefulException(
HttpErrorHandler.scala:269)
        at play.api.http.DefaultHttpErrorHandler.onServerError(HttpErrorHandler.
scala:195)
        at play.api.GlobalSettings$class.onError(GlobalSettings.scala:160)
        at play.core.j.JavaGlobalSettingsAdapter.play$core$j$JavaGlobalSettingsA
dapter$$super$onError(JavaGlobalSettingsAdapter.scala:35)
        at play.core.j.JavaGlobalSettingsAdapter$$anonfun$onError$2.apply(JavaGl
obalSettingsAdapter.scala:35)
        at play.core.j.JavaGlobalSettingsAdapter$$anonfun$onError$2.apply(JavaGl
obalSettingsAdapter.scala:35)
        at scala.Option.getOrElse(Option.scala:121)
        at play.core.j.JavaGlobalSettingsAdapter.onError(JavaGlobalSettingsAdapt
er.scala:35)
        at play.api.http.GlobalSettingsHttpErrorHandler.onServerError(HttpErrorH
andler.scala:98)
        at play.core.server.netty.PlayRequestHandler$$anonfun$2$$anonfun$apply$1
.applyOrElse(PlayRequestHandler.scala:99)
Caused by: java.lang.RuntimeException: java.lang.NullPointerException
        at be.objectify.deadbolt.java.actions.AbstractDeadboltAction.call(Abstra
ctDeadboltAction.java:129)
        at play.core.j.JavaAction$$anonfun$7.apply(JavaAction.scala:108)
        at play.core.j.JavaAction$$anonfun$7.apply(JavaAction.scala:108)
        at scala.concurrent.impl.Future$PromiseCompletingRunnable.liftedTree1$1(
Future.scala:24)
        at scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.sca
la:24)
        at play.core.j.HttpExecutionContext$$anon$2.run(HttpExecutionContext.sca
la:56)
        at play.api.libs.iteratee.Execution$trampoline$.execute(Execution.scala:
70)
        at play.core.j.HttpExecutionContext.execute(HttpExecutionContext.scala:4
8)
        at scala.concurrent.impl.Future$.apply(Future.scala:31)
        at scala.concurrent.Future$.apply(Future.scala:492)
Caused by: java.lang.NullPointerException: null
        at be.objectify.deadbolt.java.actions.AbstractDeadboltAction.preAuth(Abs
tractDeadboltAction.java:272)
        at be.objectify.deadbolt.java.actions.AbstractRestrictiveAction.execute(
AbstractRestrictiveAction.java:62)
        at be.objectify.deadbolt.java.actions.AbstractDeadboltAction.call(Abstra
ctDeadboltAction.java:121)
        at play.core.j.JavaAction$$anonfun$7.apply(JavaAction.scala:108)
        at play.core.j.JavaAction$$anonfun$7.apply(JavaAction.scala:108)
        at scala.concurrent.impl.Future$PromiseCompletingRunnable.liftedTree1$1(
Future.scala:24)
        at scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.sca
la:24)
        at play.core.j.HttpExecutionContext$$anon$2.run(HttpExecutionContext.sca
la:56)
        at play.api.libs.iteratee.Execution$trampoline$.execute(Execution.scala:
70)
        at play.core.j.HttpExecutionContext.execute(HttpExecutionContext.scala:4
8)

My DeadboltHandler implementation looks like this:

package security;

import java.util.Optional;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CompletionStage;
import java.util.concurrent.Executor;

import be.objectify.deadbolt.java.AbstractDeadboltHandler;
import be.objectify.deadbolt.java.DynamicResourceHandler;
import be.objectify.deadbolt.java.ExecutionContextProvider;
import be.objectify.deadbolt.java.models.Subject;
import models.User;
import play.mvc.Http;
import play.mvc.Result;
import views.html.accessFailed;

public class DeadboltHandlerImpl extends AbstractDeadboltHandler {

    public DeadboltHandlerImpl(ExecutionContextProvider ecProvider) {
        super(ecProvider);
    }

    public CompletionStage<Optional<Result>> beforeAuthCheck(final Http.Context context) {
        return CompletableFuture.completedFuture(Optional.empty());
    }

    public CompletionStage<Optional<? extends Subject>> getSubject(final Http.Context context) {

        String email = context.session().get("email");

        return CompletableFuture.supplyAsync(() -> Optional.ofNullable(User.findByEmail(email)),
                                             (Executor) executionContextProvider.get());
    }

    public CompletionStage<Optional<DynamicResourceHandler>> getDynamicResourceHandler(final Http.Context context) {
        return null;
    }

    @Override
    public CompletionStage<Result> onAuthFailure(final Http.Context context, final Optional<String> content) {

        return CompletableFuture.completedFuture(ok(accessFailed.render()));
    }

}

Could you please help me resolve this problem? Let me know if you need more info. I am using 2.5.0 version of play and deadbolt.

Thanks, Vitalii

Vitalii Oleksiv
  • 1,155
  • 2
  • 9
  • 11
  • Can you add your HandlerCache implementation? Also, `getDynamicResourceHandler` should return `CompletableFuture.completedFuture(Optional.empty())`. – Steve Chaloner May 12 '16 at 05:36
  • I've recently found the problem. You've mentioned it in other post here on stackoverflow. I needed to change default handler key name from "default" to be.objectify.deadbolt.java.ConfigKeys.DEFAULT_HANDLER_KEY. It works now. I will change getDynamicResourceHandler also. Thanks! – Vitalii Oleksiv May 12 '16 at 06:41

0 Answers0