У меня есть корпоративное приложение с модулем EJB и модулем веб-приложений (сервлетом). Я обращаюсь к URL сервлета из EJB с помощью URLConnection, но хочу защитить URL с некоторой степенью безопасности. Я не хочу использовать имя пользователя и пароль для аутентификации, потому что я не могу использовать какое-либо решение для входа в систему, поэтому хочу, чтобы можно было ограничить доступ к URL только из его корпоративного приложения. Пожалуйста помоги.Защита URL сервлета без использования имени пользователя аутентификация пароля
ответ
Если они работают на одной машине, обычной практикой является реорганизация бизнес-задания, выполняемого сервлетом в другой класс Java, который затем может быть импортирован/использован как EJB, так и сервлетом.
Это может быть хорошей практикой для реорганизации кода в подобном сценарии, но в моем случае выполнение сервлетов работы должно выполняться в контексте сервлета. – krish
Для чего нужен контекст сервлета? – BalusC
Код использовал контекст сервлета, чтобы получить имя приложения и обновить его в другом месте, но способ удалить эту зависимость. Похоже, что вы советуете рефакторинг кода другому классу Java и его использование в обоих сервлете EJB имеет больше смысла, поэтому я работаю над этим решением. Благодарю. – krish
Вы можете создать учетные данные пользователя на сервере приложений, который используется для развертывания приложения сервлета и защиты приложения с помощью этого пользователя (используя, например, 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 ,
Спасибо за ваш ответ. Создание пользователя на сервере приложений для защиты URL-адреса и его аутентификации с EJB означает, что мне придется жестко закодировать имя пользователя и пароль в EJB, который я хочу избежать. – krish
Там будет много информации вы оставили из:
- Является ли сервлет использоваться только модулем 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 выполнял код напрямую, а не вызывал вызов сервлета.
1. Этот сервлет, который будет использоваться EJB, в то время как другие сервлеты в том же веб-приложении используются другими клиентами. 2. Сервлет и EJB находятся в одном приложении, запущенном на одном и том же контейнере. 3. Это приложение работает в Интернете Logic Server В веб-приложении также есть другие сервлеты, к которым обращаются от других клиентов (от удаленных компьютеров), поэтому WLS может быть настроен на прием соединений только с localhost для первичного сервлета? Если да, как настроить его на WLS? – krish
Я не знаю, можно ли настроить WLS для доступа на основе хоста на каждый сервлет. Вы можете настроить контейнер для прослушивания только на локальном хосте, но это повлияет на все сервлеты и webapps в контейнере. Вы можете использовать фильтр сервлета для управления доступом к одному сервлету. –
можете ли вы сообщить, как использовать (любой образец будет очень полезен) сервлет-фильтры для управления доступом к сервлету. Я просмотрел фильтры раньше, но не мог понять, каким образом можно контролировать доступ. – krish
- 1. Аутентификация без имени пользователя и пароля
- 2. Пользовательская аутентификация без имени пользователя/пароля
- 3. Аутентификация имени пользователя и пароля
- 4. Аутентификация ZF2 без пароля
- 5. Простая временная аутентификация без имени пользователя или пароля
- 6. Аутентификация пользователей Active Directory без запроса имени пользователя и пароля
- 7. NetNamedPipeBinding и аутентификация имени пользователя и пароля
- 8. Аутентификация имени пользователя и пароля iOS
- 9. Защита имени пользователя и пароля (HTTP) в Simple WebServices - C#
- 10. Автоответчик без имени пользователя/пароля
- 11. Только аутентификация пароля пользователя GitLab (без SSH)
- 12. Аутентификация без ввода идентификатора пользователя и пароля
- 13. нужно GitHub без имени пользователя и пароля
- 14. bulkupload без имени пользователя/пароля строке
- 15. Git clone без имени пользователя и пароля
- 16. FTP-соединение без имени пользователя и пароля?
- 17. SOAP Аутентификация имени пользователя Ошибка имени пользователя
- 18. Передача имени пользователя/пароля на сервер url
- 19. Защита имени пользователя и пароля, встроенного в приложение Java Desktop
- 20. Защита безопасного пароля для пароля без .htaccess
- 21. Django администратора URL запроса имени пользователя пароля в браузере
- 22. Сделать Programmatic логин без имени пользователя/пароля?
- 23. Администратор сайта без имени пользователя и пароля
- 24. использовать svnant без имени пользователя или пароля
- 25. Firebase аутентификации без имени пользователя и пароля
- 26. Laravel 5.1 Аутентификация без пароля
- 27. Аутентификация пользователя и пароля PostgreSQL без базы данных
- 28. $ .ajax + аутентификация + `@` в имени пользователя
- 29. безопасная аутентификация пользователя без javascript
- 30. аутентификация в паспорте без пароля.
Я попытался реорганизовать общие классы в другую банку, но, похоже, слишком много зависимостей от других классов, поэтому все еще не удается, и я все еще изучаю это. Но целесообразно ли перемещать весь файл jar из WEB-INF/lib в APP-INF/lib, чтобы к этим классам можно было обращаться как с EJB, так и с модулями webapp? Будут ли какие-либо проблемы с загрузкой классов или какие-либо проблемы с инициализацией сервлета контейнером? – krish
Пожалуйста, дайте мне знать, если мой вопрос в комментарии выше должен быть отдельным вопросом? – krish