Acegi выдает AuthenticationCredentialsNotFoundException при открытии URl с BrowserLauncher 2 - PullRequest
0 голосов
/ 13 января 2010

У нас есть веб-приложение JSF, которое использует безопасность Acegi. У нас также есть отдельное приложение 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 обрабатывает перенаправление, но генерирует исключение AuthenticationCredentialsNotFoundException. Кажется, по какой-то причине аутентифицированные учетные данные не могут быть найдены в контексте безопасности.

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

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

Richard

Ответы [ 2 ]

1 голос
/ 13 января 2010

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

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

0 голосов
/ 13 января 2010

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

AUTHORIZATION:Basic VVNFUk5BTUU6UEFTU1dPUkQ=

Маркер VVNFUk5BTUU6UEFTU1dPUkQ = - это имя пользователя и пароль в кодировке base64.
Пример:

scott:tiger 

- это:

c2NvdHQ6dGlnZXI=

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

...