Базовая аутентификация для веб-службы Ajax и Jersey - PullRequest
1 голос
/ 21 марта 2012

Я защитил веб-сервис с помощью @RolesAllowed ({"Клиент"}). Я успешно протестировал код и конфигурацию безопасности с помощью клиентского API Джерси. Сейчас я пытаюсь получить доступ к тому же сервису из JavaScript с помощью AJAX. Я устанавливаю учетные данные в открытом методе XMLHttpRequest:

xhr.open("GET", url, true, "bob", "paasss");

Это просто не сработает. Позвольте мне объяснить:

XHR сначала отправляет запрос без заголовка авторизации. Только если он встречает 401 статус ответа и заголовок "WWW-Authenticate", он повторяет запрос и на этот раз отправляет заголовок авторизации. Когда служба защищена с помощью @RolesAllowed, Джерси отправляет статус 403. Следовательно, заголовок авторизации никогда не отправляется.

Единственный способ заставить это работать - установить заголовок авторизации самостоятельно:

xhr.setRequestHeader("Authorization", "Basic Ym9iOnBhc3N3MHJk");

Это приемлемый способ ведения дел? Можно ли как-то заставить Джерси вернуть 401 вместо 403, а также заголовок "WWW-Authenticate"?

Спасибо!

1 Ответ

0 голосов
/ 21 марта 2012

Вы можете сделать это, добавив ограничение авторизации в web.xml для нужного шаблона URL. Например:

<security-constraint>
    <display-name>Constraint1</display-name>
    <web-resource-collection>
        <web-resource-name>all</web-resource-name>
        <description/>
        <url-pattern>/*</url-pattern>
    </web-resource-collection>
    <auth-constraint>
        <description/>
    </auth-constraint>
</security-constraint>
<login-config>
    <auth-method>BASIC</auth-method>
</login-config>

Таким образом, он даже не достигнет Джерси, если ни один пользователь не аутентифицирован - сам контейнер вернет 401.

Если это не вариант для вас, вы можете либо расширить RolesAllowedFilterFactory, чтобы выполнить дополнительную проверку того, возвращает ли SecurityContext.getPrincipal () значение null и генерировать 401 в этом случае, либо просто добавить ContainerRequestFilter, который делает это.

...