Authentication @ContainerFilter中的身份验证注入
我使用的是DW 0.9.1,如果我能将@Auth XYzObject注入到某个ContainerRequest中,或者更好地注入到ContainerResponseFilter(或servlet过滤器)中,那就太棒了 有人知道这是否可能吗 用例:一些用户确实有不同的allowd访问速率(速率限制),例如每秒最多2个请求,每分钟最多60个请求。这可以通过注入的@Auth XYzObject进行验证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
最后,我也可以在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
。