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