2

我有一个资源类,我希望能够在调用资源方法之前检查身份验证令牌,从而避免将令牌直接传递给 Resource 方法。

我在 web.xml 中添加了以下内容:

<context-param>
        <param-name>resteasy.providers</param-name>
       <param-value>com.michael.services.interceptors.AuthorisationInterceptorImpl</param-value>
</context-param>

我的拦截器实现如下:

@Provider
public class AuthorisationInterceptorImpl implements javax.ws.rs.container.ContainerRequestFilter {

    @Inject
    private ApiAuthenticationService apiAuthenticationService

    @Override
    public void filter(ContainerRequestContext requestContext) {

       //Code to verify token   

    }

}

在我的资源类中的方法之前调用过滤器方法;但是, apiAuthenticationService 没有被注入,当我尝试调用它的方法时它为空。
我正在使用 Tapestry 5.3.7、Tapestry-Resteasy 0.3.2 和 Resteasy 2.3.4.Final。这可以做到吗?

4

2 回答 2

1

基于对tapestry-resteasy 代码的快速浏览,我认为这不会起作用。

@Inject 注解是 Tapestry-ioc 的一部分;如果 Tapestry 没有实例化一个类,则不支持 @Inject 注释。

中定义的过滤器web.xml由对 Tapestry 和 Tapestry 注解没有任何特殊知识的 servlet 容器(Jetty、Tomcat 等)实例化。

我认为最好将过滤器贡献给 Tapestry 的 HttpServletRequestHandler 或 RequestHandler 管道(参见他们的 JavaDoc)。但是,我不确定如何访问 ContainerRequestContext。

于 2014-05-12T15:13:16.233 回答
1

使用Tapestry-resteasy,您无需在 web.xml 文件中定义提供者。

如果您想使用 Tapestry 的自动构建机制,只需将您的提供程序与您的资源一起移动到.rest包中。

如果不想使用自动发现/自动构建,只需将其贡献给 javax.ws.rs.core.Application

@Contribute(javax.ws.rs.core.Application.class)
    public static void configureRestProviders(Configuration<Object> singletons, AuthorisationInterceptor authorisationInterceptor)
    {
        singletons.add(authorisationInterceptor);
    }

即使您可以使用 rest 提供程序来保证安全性,但采纳 Howard 的建议并在 Tapestry 管道中实现您自己的过滤器可能是一个好主意。

顺便说一句,你也可以试试Tapestry-security :)

于 2014-05-12T21:50:58.787 回答