Как извлечь имя пользователя и пароль в Spring Boot?

#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 хэширует пароль. Не рекомендуется сохранять пароль в виде обычного текста, поскольку это проблема секретности.