In our Play Framework application, we are using the Deadbolt module for user authentication. This means that the getSubject() method of our DeadboltHandler-implementation will be called before the actual Controller method. However, we need to transport the determined User-ID from the DeadboltHandler's getSubject() method to the Controller method.
Up to and including Play Framework 2.6 this could easily be done by adding the User-ID to the HttpContext.args, because the HttpContext was available in getSubject() as well as in the Controller-Method. Unfortuately, in Play Framework 2.7 and later, there no longer is a HttpContext - we have to work with HttpRequest directly. But it seems that HttpRequest is immutable; we cannot add the determined User-ID to HttpRequest easily.
Yes, there is Http.Request.withAttrs(), but this does not modify the HttpRequest object but instead returns a new HttpRequest object. So this is not helpful for passing any information from getSubject() method to the Controller method, as far as I can tell.
So, what is the recommended way to pass Request-specific information from the DeadboltHandler to the Controller-Method in Play Framework 2.7+ ???
Controller class:
public class MyController extends Controller
{
@SubjectPresent
public CompletionStage<Result> search()
{
final Subject subject = Thingamabob.currentSubject();
/* I need something like this ^^^ */
}
}
DeadboltHandler implementation:
class public class MyDeadboltHandler extends AbstractDeadboltHandler {
@Override
public CompletionStage<Optional<? extends Subject>>
getSubject(final Http.RequestHeader request) {
final Subject subject = determineSubjectFromRequestHeader(request);
return CompletableFuture.completedFuture(Optional.of(subject));
}
}
Note: The method MyDeadboltHandler.subject(), which determines the Subject, is called implicitely by the framework before the actual controller method will be called.
Thanks you and best regards.