Использование перехватчика с Tapestry Resteasy

У меня есть класс ресурса, и я хотел бы иметь возможность проверять токен аутентификации перед вызовом метода ресурса, таким образом, избегая необходимости передавать токен непосредственно в метод 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. Можно ли это сделать?

2 ответа

Решение

Я не думаю, что это будет работать, основываясь на быстром взгляде на код гобелена.

Аннотация @Inject является частью работы tapestry-ioc; если класс не создан с помощью Tapestry, аннотация @Inject не учитывается.

Фильтры определены в web.xml создаются контейнером сервлетов (Jetty, Tomcat и т. д.), которые не имеют специальных знаний о аннотациях Tapestry и Tapestry.

Я думаю, что вам будет лучше добавить фильтр в конвейеры Tapttry HttpServletRequestHandler или RequestHandler (см. Их JavaDoc). Однако я не уверен, как вы можете получить доступ к ContainerRequestContext.

С помощью http://tynamo.org/tapestry-resteasy+guide вам не нужно определять провайдера в файле web.xml.

Если вы хотите использовать механизм автоматической сборки Tapestry, просто переместите вашего провайдера в пакет .rest вместе с вашими ресурсами.

Если вы не хотите использовать autodiscovery / autobuild, просто добавьте его в javax.ws.rs.core.Application

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

Даже если вы можете использовать провайдеров отдыха для обеспечения безопасности, возможно, будет хорошей идеей воспользоваться советом Говарда и внедрить собственный фильтр в конвейер гобеленов.

Кстати, вы также можете попробовать безопасность гобеленов:)

Другие вопросы по тегам