Защита URL сервлета без использования аутентификации по паролю - PullRequest
2 голосов
/ 01 февраля 2011

У меня есть корпоративное приложение с модулем EJB и модулем веб-приложения (сервлет).Я получаю доступ к URL сервлета из EJB с помощью URLConnection, но хочу защитить URL с некоторой безопасностью.Я не хочу использовать имя пользователя и пароль для аутентификации, потому что я не могу использовать какое-либо решение единой регистрации, поэтому я хочу, если есть способ ограничить доступ к URL-адресу только из его корпоративного приложения.Пожалуйста помоги.

Ответы [ 3 ]

3 голосов
/ 01 февраля 2011

Вы оставили много информации:

  • Используется ли сервлет только вашим EJB-модулем или другими клиентами?
  • Работают ли сервлет и модуль EJB в одном и том же контейнере? Это же физическая машина?
  • Какой веб-сервер / контейнер сервлетов / J2EE-контейнер вы используете?

Если сервлет используется только модулем EJB, и они оба находятся на одном компьютере, вы можете просто настроить свой веб-контейнер так, чтобы он принимал соединения только от localhost, и изменить URL-адрес, используемый вашим модулем EJB для указания localhost вместо имени публичного домена или IP-адреса.

Если они находятся на разных машинах, или если ваш сервлет используется другими клиентами, то вам нужно будет как-то аутентифицировать модуль EJB. Вы можете использовать клиентские сертификаты SSL (см. этот вопрос ) или настроить свой контейнер сервлетов для разрешения соединений с IP-адреса модуля EJB.

EDIT

Использование фильтра сервлетов для управления доступом довольно просто. В вашем случае вы хотите убедиться, что запрос исходит от localhost. Если нет, отправьте неавторизованное сообщение обратно клиенту.

Вот очень простая реализация метода doFilter, которая должна это сделать:

public void doFilter(ServletRequest request,
                     ServletResponse response,
                     FilterChain chain)
   throws ServletException, IOException
{
    if (!request.getRemoteAddr().equals("127.0.0.1")) {
        HttpServletResponse rsp = (HttpServletResponse) response;
        rsp.sendError(HttpServletResponse.SC_FORBIDDEN, "You are not authorized to access this resource.");
    }

    chain.doFilter(request, response);
}

Добавьте фильтр к вашему web.xml примерно так:

<filter>
    <filter-name>AuthorizationFilter</filter-name>
    <filter-class>com.foo.bar.AuthorizationFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>AuthorizationFilter</filter-name>
    <servlet-name>RestrictedServlet</servlet-name>
</filter-mapping>

Фильтры выполняются в том порядке, в котором они отображаются в web.xml, поэтому убедитесь, что фильтр авторизации является первым в списке.

Сказав все это, я согласен с BalusC здесь. Если это вообще возможно, вам следует реорганизовать свой код, чтобы модуль EJB выполнял код напрямую, а не с помощью вызова сервлета.

1 голос
/ 01 февраля 2011

Вы можете создать учетные данные пользователя на сервере приложений, который вы используете для развертывания приложения сервлета и защиты приложения с использованием этого пользователя (например, с использованием BASIC-аутентификации):

<security-constraint>
  <web-resource-collection>
    <web-resource-name>
      Entire Application
    </web-resource-name>
    <url-pattern>/*</url-pattern>
  </web-resource-collection>
  <auth-constraint>
      <role-name>member</role-name>
  </auth-constraint>
</security-constraint>

Затем вы можете использовать аутентификацию из вашего EJB.

1 голос
/ 01 февраля 2011

Если они выполняются на одной и той же машине, обычной практикой является рефакторинг бизнес-задания, выполняемого сервлетом, в другой класс Java, который затем может быть импортирован / использован как EJB, так и сервлетом.

...