Использование перехватчика с 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);
}
Даже если вы можете использовать провайдеров отдыха для обеспечения безопасности, возможно, будет хорошей идеей воспользоваться советом Говарда и внедрить собственный фильтр в конвейер гобеленов.
Кстати, вы также можете попробовать безопасность гобеленов:)