Acegi бросает аутентификацию CredentialSnotFoundException при открытии URL -адреса с BrowserLauncher 2
-
20-09-2019 - |
Вопрос
У нас есть веб -приложение 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.