ОК, поэтому мы делаем именно то, что вы просите в одной из наших систем. Это работает в Spring boot 1 и 2. Вот шаги, которые нужно предпринять.
Создать расширение компонента AbstractPreAuthenticatedProcessingFilter
. Реализуйте getPreAuthenticatedPrincipal
и getPreAuthenticatedCredentials
, чтобы извлечь аутентифицированного пользователя и дополнительные учетные данные (например, сертификат) из вашей системы единого входа. Создайте FilterRegistrationBean
для этого bean-компонента фильтра, иначе благодаря сканированию компонентов весенней загрузки он попадет в основную цепочку фильтров, а также в цепочку фильтров безопасности.
Создание компонента службы данных (авторизации) пользователя, реализующего AuthenticationUserDetailsService<PreAuthenticatedAuthenticationToken>
. Переопределите loadUserDetails
, чтобы получить свой аутентифицированный токен и использовать его для добавления разрешений в виде GrantedAuthority
списков.
В вашем подклассе WebSecurityConfigurerAdapter
bean выполните следующее:
Введите ваш подкласс AbstractPreAuthenticatedProcessingFilter
, а также ваш подкласс AuthenticationUserDetailsService
.
Добавьте члена класса типа PreAuthenticatedAuthenticationProvider
и инициализируйте его с помощью new
(это не bean-компонент).
В configure(HttpSecurity)
инициализируйте ваш bean-компонент фильтра с помощью менеджера аутентификации: yourBean.setAuthenticationManager(authenticationManager())
, затем убедитесь, что ваш фильтр включен:
http.addFilter(yourBean)
.authorizeRequests()
.requestMatchers(...)
- Переопределите
configure(AuthenticationManagerBuilder)
и инициализируйте PreAuthenticatedAuthenticationProvider
, созданный на шаге (2), для реализации компонентов проверки подлинности и авторизации.
this.preAuthProvider.setPreAuthenticatedUserDetailsService(this.userDetailsService);
this.preAuthProvider.setThrowExceptionWhenTokenRejected(true);
authBuilder.authenticationProvider(this.preAuthProvider);
Это должно быть все. Надеюсь, это поможет.