package security;
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 com.feth.play.module.pa.PlayAuthenticate;
import com.feth.play.module.pa.user.AuthUserIdentity;
import models.User;
import play.mvc.Http;
import play.mvc.Result;
import java.util.Optional;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CompletionStage;
public class MyDeadboltHandler extends AbstractDeadboltHandler {
private final PlayAuthenticate auth;
public MyDeadboltHandler(final PlayAuthenticate auth, final ExecutionContextProvider exContextProvider) {
super(exContextProvider);
this.auth = auth;
}
@Override
public CompletionStage<Optional<Result>> beforeAuthCheck(final Http.Context context) {
if (this.auth.isLoggedIn(context.session())) {
// user is logged in
return CompletableFuture.completedFuture(Optional.empty());
} else {
// user is not logged in
// call this if you want to redirect your visitor to the page that
// was requested before sending him to the login page
// if you don't call this, the user will get redirected to the page
// defined by your resolver
final String originalUrl = this.auth.storeOriginalUrl(context);
context.flash().put("error",
"You need to log in first, to view '" + originalUrl + "'");
return CompletableFuture.completedFuture(Optional.ofNullable(redirect(this.auth.getResolver().login())));
}
}
@Override
public CompletionStage<Optional<? extends Subject>> getSubject(final Http.Context context) {
final AuthUserIdentity u = this.auth.getUser(context);
// Caching might be a good idea here
return CompletableFuture.completedFuture(Optional.ofNullable((Subject)User.findByAuthUserIdentity(u)));
}
@Override
public CompletionStage<Optional<DynamicResourceHandler>> getDynamicResourceHandler(
final Http.Context context) {
return CompletableFuture.completedFuture(Optional.empty());
}
@Override
public CompletionStage<Result> onAuthFailure(final Http.Context context,
final Optional<String> content) {
// if the user has a cookie with a valid user and the local user has
// been deactivated/deleted in between, it is possible that this gets
// shown. You might want to consider to sign the user out in this case.
return CompletableFuture.completedFuture(forbidden("Forbidden"));
}
}