2011-02-01 6 views
2

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

+0

Я попытался реорганизовать общие классы в другую банку, но, похоже, слишком много зависимостей от других классов, поэтому все еще не удается, и я все еще изучаю это. Но целесообразно ли перемещать весь файл jar из WEB-INF/lib в APP-INF/lib, чтобы к этим классам можно было обращаться как с EJB, так и с модулями webapp? Будут ли какие-либо проблемы с загрузкой классов или какие-либо проблемы с инициализацией сервлета контейнером? – krish

+0

Пожалуйста, дайте мне знать, если мой вопрос в комментарии выше должен быть отдельным вопросом? – krish

ответ

1

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

+0

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

+0

Для чего нужен контекст сервлета? – BalusC

+0

Код использовал контекст сервлета, чтобы получить имя приложения и обновить его в другом месте, но способ удалить эту зависимость. Похоже, что вы советуете рефакторинг кода другому классу Java и его использование в обоих сервлете EJB имеет больше смысла, поэтому я работаю над этим решением. Благодарю. – krish

1

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

<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 ,

+0

Спасибо за ваш ответ. Создание пользователя на сервере приложений для защиты URL-адреса и его аутентификации с EJB означает, что мне придется жестко закодировать имя пользователя и пароль в EJB, который я хочу избежать. – krish

3

Там будет много информации вы оставили из:

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

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

Если они находятся на разных компьютерах или ваш сервлет используется другими клиентами, вам необходимо каким-то образом аутентифицировать модуль EJB. Вы можете использовать SSL-сертификаты клиентов (см. this question) или настроить свой контейнер сервлета, чтобы разрешать подключения с 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 выполнял код напрямую, а не вызывал вызов сервлета.

+0

1. Этот сервлет, который будет использоваться EJB, в то время как другие сервлеты в том же веб-приложении используются другими клиентами. 2. Сервлет и EJB находятся в одном приложении, запущенном на одном и том же контейнере. 3. Это приложение работает в Интернете Logic Server В веб-приложении также есть другие сервлеты, к которым обращаются от других клиентов (от удаленных компьютеров), поэтому WLS может быть настроен на прием соединений только с localhost для первичного сервлета? Если да, как настроить его на WLS? – krish

+0

Я не знаю, можно ли настроить WLS для доступа на основе хоста на каждый сервлет. Вы можете настроить контейнер для прослушивания только на локальном хосте, но это повлияет на все сервлеты и webapps в контейнере. Вы можете использовать фильтр сервлета для управления доступом к одному сервлету. –

+0

можете ли вы сообщить, как использовать (любой образец будет очень полезен) сервлет-фильтры для управления доступом к сервлету. Я просмотрел фильтры раньше, но не мог понять, каким образом можно контролировать доступ. – krish

Смежные вопросы