2016-08-01 1 views
-3

Я разрабатываю веб-приложение (сервлеты, jsp) с помощью служб Rest с помощью jax rs. В пользовательском интерфейсе веб-приложения я вызываю эти веб-службы через jaxrs-клиент с помощью сервлетов (сервлеты называет jax-rs-клиент, клиент inturn вызывает веб-службы). По-видимому, я подвергаю эти веб-сервисы.Веб-приложение, JAX-rs, клиент Jax-rs, сервлеты, службы отдыха

Теперь я пытаюсь добавить аутентификацию, авторизацию таким образом, что при обращении к этим веб-сервисам через веб-интерфейс (HTML, Servlets, jax-rs client) не должно быть никаких проверок. но при обращении к веб-службам непосредственно через URL-адрес браузера или некоторые плагины, такие как расширенный априод отдыха, почтальон должен показывать ошибку аутентификации. Как я могу достичь этого

Inshort - как отличить прямые вызовы веб-сервисов и вызовы пользовательского интерфейса, сделанные для этих веб-сервисов.

Заранее спасибо

+0

В принципе: вы не можете. Запрос Почтмана может быть настроен точно как запрос, так как конкретный браузер отправит его. Push приходит, чтобы засунуть свой запрос, поступающий с конкретной клиентской машины; вы не можете контролировать, какая часть программного обеспечения на этом клиентском компьютере отправила запрос. Также не стоит заботиться, вы хотите аутентифицировать и авторизировать клиента, а не программное обеспечение. – Gimby

+0

Возможный дубликат [Как я могу получить информацию о клиенте, такую ​​как ОС и браузер] (http://stackoverflow.com/questions/1326928/how-can-i-get-client-infomation-such-as-os-and- браузер) – Raedwald

ответ

0

Если я правильно понимаю, вы хотите, чтобы различать «внутренние» вызовы, которые происхождение из системы, против «внешнего» звонков, поступающих из Интернета.

Что вы можете сделать, это добавить HTTP basic authentication. Это, в основном, HTTP-заголовок, который содержит пароль пользователя +, который проверяется при поступлении HTTP на веб-сервере. Сервлеты, которые инициируют вызовы сервисам REST, могут добавлять HTTP-заголовок с предопределенными учетными данными. Это обеспечивает не только аутентификацию, но и различные уровни авторизации для разных пользователей.

Есть несколько библиотек, которые поддерживают эту функцию (аутентификации + авторизации) Я использую Apache Shiro и он также содержит управление сеансами в виде печенья

Примечание: sohuld следует помнить, что основной заголовок аутентификации HTTP является не зашифрован. он использует безопасное HTTP-соединение (то есть HTTPS) для обеспечения безопасности.

EDIT: после вопроса в комментарии: Хотя он официально не поддерживается, вы можете иметь несколько путей URI, которые указывают на одну и ту же службу REST (эффективно, как если бы они указывали несколько аннотаций @Path на один класс или метод) хитрость заключается в том, чтобы использовать регулярные выражения, увидеть этот вопрос для деталей Can we have more than one @Path annotation for same REST method

так, если у вас есть/path1 и/Path2, которые указывают на SME службы REST, вы можете определить фильтр аутентификации, который будет вызван только/path1

+0

Спасибо sharonbn, который отвечает на мой вопрос. – king934324

+0

на данный момент я использую сервлет-фильтры для базовой проверки подлинности, поэтому, что когда-либо вызываю, я делаю, вызывает ли его веб-сервисный вызов из браузера или его кнопки в пользовательском интерфейсе, управление переходит к этому фильтру. Проблема в том, что я вызываю из любых плагинов postman..etc я могу добавить имя пользователя и пароль в заголовке и сделать аутентификацию. но если вызов сделан внутренне (нажатие кнопки в Ui ... и т. д.), то у меня нет этого заголовка авторизации в запросе (например: когда я пытаюсь войти в приложение). как справиться с этой проблемой. @ sharonbn – king934324

+0

Прежде всего, вы можете добавить заголовок на страницу входа, используя простой скрипт js.если вы хотите, чтобы у вас не было заголовка, вы можете иметь несколько путей, указывающих на одну и ту же службу, но применять фильтр только к одному из них. –