在我们的 Play Framework 应用程序中,我们使用Deadbolt模块进行用户身份验证。这意味着getSubject()
我们的 DeadboltHandler 实现的方法将在实际的 Controller 方法之前被调用。但是,我们需要将确定的 User-ID 从 DeadboltHandler 的getSubject()
方法传输到 Controller 方法。
直到并包括 Play Framework 2.6,这可以通过将 User-ID 添加到 来轻松完成HttpContext.args
,因为HttpContext
在getSubject()
Controller-Method 和 Controller-Method 中都可以使用。不幸的是,在 Play Framework 2.7 及更高版本中,不再有HttpContext
- 我们必须HttpRequest
直接使用。但这似乎HttpRequest
是一成不变的;我们无法HttpRequest
轻松添加确定的用户 ID。
是的,有Http.Request.withAttrs()
,但这不会修改HttpRequest
对象,而是返回一个新HttpRequest
对象。因此,据我所知,这对于将任何信息从方法传递到 Controller 方法没有帮助。getSubject()
那么,在 Play Framework 2.7+ 中将特定于请求的信息从 DeadboltHandler 传递到 Controller-Method 的推荐方法是什么???
控制器类:
public class MyController extends Controller
{
@SubjectPresent
public CompletionStage<Result> search()
{
final Subject subject = Thingamabob.currentSubject();
/* I need something like this ^^^ */
}
}
DeadboltHandler 实现:
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));
}
}
注意:MyDeadboltHandler.subject()
确定 的方法由框架隐式Subject
调用,然后调用实际的控制器方法。
谢谢你和最好的问候。