Authentication @ContainerFilter中的身份验证注入

Authentication @ContainerFilter中的身份验证注入,authentication,jax-rs,servlet-filters,dropwizard,inject,Authentication,Jax Rs,Servlet Filters,Dropwizard,Inject,我使用的是DW 0.9.1,如果我能将@Auth XYzObject注入到某个ContainerRequest中,或者更好地注入到ContainerResponseFilter(或servlet过滤器)中,那就太棒了 有人知道这是否可能吗 用例:一些用户确实有不同的allowd访问速率(速率限制),例如每秒最多2个请求,每分钟最多60个请求。这可以通过注入的@Auth XYzObject进行验证 最后,我也可以在Ressource中这样做,那里有这些信息,但正如我所说的,在我的Ressource

我使用的是DW 0.9.1,如果我能将@Auth XYzObject注入到某个ContainerRequest中,或者更好地注入到ContainerResponseFilter(或servlet过滤器)中,那就太棒了

有人知道这是否可能吗

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


最后,我也可以在Ressource中这样做,那里有这些信息,但正如我所说的,在我的Ressource之外的过滤器或其他地方这样做会很酷。我不想这样做,这是身份验证/授权过程,因为速率限制与此无关。目前,我尝试过的所有变体都不起作用,因此似乎不可能,但我希望有人知道诀窍。

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

但是,当您创建
XyzObject
时,您实现了它。DW之所以让您使用此类型,是因为在它进行身份验证之后,它在
SecurityContext
中设置了
Principal
,如图所示

如果您查看for的实现,您将看到它获取
主体的方式是by。这就是
主体
被注入
@Auth
作为方法参数的方式

ContainerRequestFilter
中(以及在其他位置),您可以访问
SecurityContext
。在筛选器中,您可以使用
requestContext.getSecurityContext()
获取它。因此,在您的过滤器中,您可以从
SecurityContext
获取
主体
,然后将其强制转换

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

啊,这太简单了,寻找更复杂的解决方案。您是对的,这确实是实现这一点的最佳方法,可能需要更多的强制转换检查代码。谢谢。经过更多的测试,看看源代码,我感觉有一个bug。身份验证筛选器仅向其参数具有
@auth
注释的方法注册,或者该方法本身使用其中一个角色授权注释进行注释(例如
@RolesAllowed
)。因此,如果您取出参数上的
@Auth
,过滤器将永远不会执行,除非您有一个角色批注。好的,解决这个问题的一个方法是不使用
AuthDynamicFeature
,只需自己注册Auth过滤器,并且确保不注册
AuthValueFactoryProvider
。在这种情况下,您根本不能使用
@Auth
注释。所以有一些限制。如果这对你来说是个大问题的话,可能会提交一份bug报告。实际上,请记下我之前的评论。我仍然在过滤器中有Auth注释,试图注入XyzObject。这会导致AuthValueFactoryProvider在启动时失败。因此,您可以同时注册过滤器和
AuthValueFactory
。通过这种组合,auth过滤器将过滤所有请求,您仍然可以在需要的任何方法参数中使用
@auth