Как передать атрибут в Spring Controller в приложении без сохранения состояния? - PullRequest
0 голосов
/ 03 октября 2019

В настоящее время я внедряю решение SAML SSO в своем приложении, где в моем SAMLUserDetailsService я загружаю своего пользователя

@Service
public class SAMLUserDetailsServiceImpl implements SAMLUserDetailsService {

    @Override
    public Object loadUserBySAML(SAMLCredential credential) throws UsernameNotFoundException {
        return new User(credential.getNameID().getValue());
    }

}

Затем я использую SavedRequestAwareAuthenticationSuccessHandler для перенаправления пользователя на контроллер посадкипосле успешной аутентификации.

@Bean
public AuthenticationSuccessHandler successRedirectHandler() {
    SavedRequestAwareAuthenticationSuccessHandler successRedirectHandler =
            new SavedRequestAwareAuthenticationSuccessHandler();
    successRedirectHandler.setDefaultTargetUrl("/landing");
    return successRedirectHandler;
}

Контроллер:

@RequestMapping("/landing")
public ResponseEntity landing(User user) {
    return ResponseEntity.ok(user.getLoginName());
}

Есть ли способ передать объект User в мой контроллер. Я заметил, что это обычно делается с помощью HandlerMethodArgumentResolver, но, поскольку мое приложение не имеет состояния и не использует сеансы, есть ли способ добиться этого, используя другой способ, пожалуйста?

1 Ответ

0 голосов
/ 03 октября 2019

Для этого вам не нужна инъекция. Вместо этого используйте следующее:

SecurityContextHolder.getContext().getAuthentication().getName()

или

SecurityContextHolder.getContext().getAuthentication().getPrincipal()

В последнем случае проверьте тип того, что getPrincipal() вернуло. Это может быть строка, это может быть UserDetails. Если последнее, приведите его к UserDetails и позвоните getUsername().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...