首页 > 解决方案 > 如何将信息从 DeadboltHanlder 传递到 Controller-Method (Play Framework 2.8)

问题描述

在我们的 Play Framework 应用程序中,我们使用Deadbolt模块进行用户身份验证。这意味着getSubject()我们的 DeadboltHandler 实现的方法将在实际的 Controller 方法之前被调用。但是,我们需要将确定的 User-ID 从 DeadboltHandler 的getSubject()方法传输到 Controller 方法。

直到并包括 Play Framework 2.6,这可以通过将 User-ID 添加到 来轻松完成HttpContext.args,因为HttpContextgetSubject()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调用,然后调用实际的控制器方法。

谢谢你和最好的问候。

标签: playframeworkdeadbolt-2deadbolt

解决方案


推荐阅读