#spring-boot #spring-security #sapui5 #single-sign-on #cloud-foundry
#spring-boot #spring-безопасность #sapui5 #единый вход #облако-foundry
Вопрос:
У меня есть сценарий, в котором я пытаюсь подключить свою интерфейсную систему (SAP UI5) к источнику OData для получения результатов.
Однако в Java есть промежуточный уровень программного обеспечения — Spring boot, который фиксирует все запросы от пользовательского интерфейса и пересылает их службам OData. Причина в том, что службы OData недоступны публично. Они находятся за брандмауэром, тогда как приложение Spring Boot общедоступно. Итак, я использую обратный прокси для установления соединения между Spring Boot и службами OData, которое работает.
Но проблема здесь в том, что службы OData (API) требуют аутентификации пользователя для доступа к данным. Эта аутентификация пользователя уже выполняется один раз на уровне пользовательского интерфейса.
В пользовательском интерфейсе -> SPring Boot application включен единый вход App2Appp. Таким образом, я могу использовать Spring security для доступа к основному объекту. Я хочу знать, помимо знания имени пользователя вошедшего в систему пользователя, как мне получить пароль?
Комментарии:
1. Аутентификация является базовой.
2. Вы могли бы реализовать пользовательский фильтр, который извлекает имя пользователя и пароль из вашего запроса на вход (форма входа) или заголовка HTTP (basic).
Ответ №1:
Когда у вас есть приложение, защищенное Spring Security, будь то Spring Boot или обычный Spring, у вас есть объект, который получает доступ к безопасности конкретной аутентификации.
Вы можете вызвать и получить принципал (объект безопасности Java):
Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
Этот принципал в Spring является объектом UserDetails, в котором мы настраиваем всю информацию о пользователе в Spring.
Затем получить имя пользователя и пароль и передать их вашим службам OData:
String username = ((UserDetails)principal).getUsername();
String password = ((UserDetails)principal).getPassword();
Комментарии:
1. Если пользовательский интерфейс настроен на использование SO для вызова серверной части, смогу ли я извлечь пароль в серверной части, используя это, при условии, что аутентификация прошла в пользовательском интерфейсе?
2. Если Spring Security также имеет эту информацию, то да, т. Е. Если у него также есть настроенная информация о пользователе и паролях.
3. @FrancescRecio: Ваше решение работает, только если пароль сохранен в виде обычного текста в вашей базе данных. По умолчанию Spring Security хэширует пароль. Не рекомендуется сохранять пароль в виде обычного текста, поскольку это проблема секретности.