Acegi бросает аутентификацию CredentialSnotFoundException при открытии URL -адреса с BrowserLauncher 2

StackOverflow https://stackoverflow.com/questions/2058191

Вопрос

У нас есть веб -приложение JSF, которое использует Acegi Security. У нас также есть автономное приложение Java Swing. Одна функция приложения Swing - загрузить домашнюю страницу пользователя в окне браузера.

Для этого мы в настоящее время используем Commons HttpClient для аутентификации пользователя с помощью веб -приложения:

String url = "http://someUrl/j_acegi_security_check";
HttpClient client = new HttpClient();
System.setProperty(trustStoreType, "Windows-ROOT");
PostMethod  method = new PostMethod(url);
method.addParameter("j_username", "USERNAME");
method.addParameter("j_password", "PASSWORD");
int statusCode = client.executeMethod(method);
if (statusCode == HttpStatus.SC_MOVED_TEMPORARILY ) {
    Header locationHeader= method.getResponseHeader("Location");
    String redirectUrl = locationHeader.getValue();
    BrowserLauncher launcher = new BrowserLauncher();
    launcher.openURLinBrowser(redirectUrl);
}

Это возвращает ответ HTTP 302, из которого мы принимаем URL -адрес перенаправления и открываем его с помощью BrowserLauncher 2. URL содержит новый идентификатор сеанса, что -то вроде:

http://someUrl/HomePage.jsf;jsessionid=C4FB2F643CE48AC2DE4A8A4C354033D4

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

У кого -нибудь есть представление о том, почему это происходит? Если кому -то нужна дополнительная информация, я буду рад сделать это.

Большое спасибо,

Ричард

Это было полезно?

Решение

Я никогда не делал Acegi/Springsecurity, но симптомы достаточно ясны: в запросе отсутствует некоторая важная информация. Вам хотя бы нужно исследовать все заголовки ответов, если нет ничего нового, что потребности быть переданным обратно в заголовке последующего запроса. Может быть, еще одна запись cookie, которая представляет собой учетные данные Acegi.

Но другое предостережение заключается в том, что вы на самом деле не можете открыть только URL -адрес в местном экземпляре браузера, потому что нет никакого способа передать необходимые заголовки запроса вдоль него. Вам понадобится приложение Swing Application в качестве встроенного веб -браузера. Например, получите HTML -ответ в InputStream и отображать/отображать его каким -то образом в кадре. Я бы проверил, если для этого еще нет существующего API, потому что это будет включать в себя гораздо больше работы, чем вы изначально думаете ... (преуменьшение).

Другие советы

В этом случае вы можете выполнять базовую аутентификацию и установить этот заголовок в каждом запросе вместо отправки JSessionId:

AUTHORIZATION:Basic VVNFUk5BTUU6UEFTU1dPUkQ=

Токен Vvnfuk5btuu6ueftu1dpukq = это имя пользователя и кодированное пароль Base64.
Пример:

scott:tiger 

является:

c2NvdHQ6dGlnZXI=

Еще одна вещь: используйте SSL.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top