ContainerFilter 中的@Auth 注入

@Auth Injection in ContainerFilter

我正在使用 DW 0.9.1,如果我可以将 @Auth XYzObject 注入到某些 ContainerRequest 中,或者甚至更好地注入到 ContainerResponseFilter(或 servlet 过滤器)中,那就太棒了。

有谁知道这是否可能?

用例:一些用户确实有不同的允许访问速率(速率限制),例如最大限度。每秒 2 个请求,每分钟最多 60 个。这可以通过注入的@Auth XYzObject 来验证。

最后,我也可以在资源中执行此操作,那里提供了此信息,但正如我所说,在我的资源之外的过滤器或其他东西中执行此操作会很酷。我不想这样做是身份验证/授权过程,因为速率限制与此无关。目前,我尝试了所有变体,但没有任何效果,所以这似乎是不可能的,但我希望有人知道诀窍。

@Auth 注释的工作原理是它由 ValueFactoryProvider 处理,仅用于(资源)方法参数注入。所以你不能将它注入任意位置。

但是,当您创建 XyzObject 时,您让它实现了 java.security.Principal. The reason DW makes you use this type, is because after it authenticates, it sets the Principal in the SecurityContext, as seen in the AuthFilter

如果您查看 AuthValueFactoryProvider, you will see that the way it obtains the Principal is by getting it from the SecurityContext 的实现。这就是 Principal 作为方法参数注入 @Auth 的方式。

ContainerRequestFilter(以及其他许多位置),您可以访问 SecurityContext。在过滤器中,您可以使用 requestContext.getSecurityContext() 获取它。因此,在您的过滤器中,您可以从 SecurityContext 中获取 Principal 并将其转换为

@Override
public void filter(ContainerRequestContext requestContext) throws IOException {
    Principal principal = requestContext.getSecurityContext().getUserPrincipal();
    if (principal != null) {
        XyzObject xyz = (XyzObject)principal;     
    } 
}