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;
}
}
我正在使用 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;
}
}