Где подключить аутентификацию в Grizzly?

Я использую Grizzly HttpServer, в котором зарегистрированы два экземпляра HttpHandler:

  • под /api/* есть приложение в стиле Джерси REST, предлагающее API продукта, и
  • под /* есть StaticHttpHandler, который обслуживает статический контент HTML/JavaScript (который, среди прочего, общается с API под /api/

Для аутентификации в настоящее время я защищаю только API, используя Джерси ContainerRequestFilter, реализующий базовую аутентификацию HTTP, которая очень похожа на то, что представлено в еще один вопрос SO.

Но поскольку требования изменились, теперь я хочу требовать аутентификацию для всех запросов, поступающих на сервер. Так что я бы хотел поднять аутентификацию на один уровень выше, с Джерси на Гризли. К сожалению, я совершенно не понимаю, где я могу подключить «фильтр запроса» (или как он там называется) в Grizzly. Может ли кто-нибудь указать мне соответствующий API для этого?


person Waldheinz    schedule 15.10.2013    source источник


Ответы (2)


Самым простым решением будет использование поддержки встроенных сервлетов Grizzly.

Это, конечно, означает, что вам нужно будет немного поработать, чтобы перенести текущую логику HttpHandler на Servlets, но на самом деле это не должно быть слишком сложно, поскольку HttpHandler API очень похож.

Я дам несколько высоких баллов за это.

HttpServer server = HttpServlet.createSimpleServer(<docroot>, <host>, <port>);
// use "" for <context path> if you want the context path to be /
WebappContext ctx = new WebappContext(<logical name>, <context path>);

// do some Jersey initialization here

// Register the Servlets that were converted from HttpHandlers
ServletRegistration s1 = ctx.addServlet(<servlet name>, <Servlet instance or class name>);
s1.addMapping(<url pattern for s1>);
// Repeat for other Servlets ...

// Now for the authentication Filter ...
FilterRegistration reg = ctx.addFilter(<filter name>, <filter instance or class name>);
// Apply this filter to all requests
reg.addMapping(null, "/*");

// do any other additional initialization work ...

// "Deploy" ctx to the server.
ctx.deploy(server);

// start the server and test ...

ПРИМЕЧАНИЕ. Динамическая регистрация сервлетов и фильтров основана на API-интерфейсе сервлета 3.0, поэтому, если вам нужна информация о том, как работать с прослушивателями сервлетов, параметрами инициализации и т. д., я бы рекомендовал просмотреть javadocs Servlet 3.0.

ПРИМЕЧАНИЕ 2. Реализация сервлета Grizzly не на 100 % совместима со спецификацией сервлета. Он не поддерживает стандартные аннотации сервлетов или развертывание традиционного развертывания архива веб-приложений сервлетов.

Наконец, есть примеры использования встроенного Servlet API здесь

person rlubke    schedule 18.10.2013

Часть «подключения» можно выполнить с помощью HttpServerProbe (протестировано с Grizzly 2.3.5):

srv.getServerConfiguration().getMonitoringConfig().getWebServerConfig()
.addProbes(new HttpServerProbe.Adapter() {
   @Override
   public void onRequestReceiveEvent(HttpServerFilter filter,
     Connection connection, Request request) {
     ...
   }

   @Override
   public void onRequestCompleteEvent(HttpServerFilter filter,
  Connection connection, Response response) {
   }
 });

Для «связывания» с ContainerRequestFilter вы можете взглянуть на мой вопрос: UnsupportedOperationException getUserPrincipal

person Wolfgang Fahl    schedule 21.11.2013