У меня есть работающее API-шлюз приложение, построенное на spring-boot 2.2 , которое является клиентом Oauth2 , поддерживающим предоставление кода авторизации расход. Он построен с использованием spring-boot @ EnableOAuth2Sso , который создаст весенний сеанс и контекст oauth2 после успешного входа пользователя. Каждый запрос к серверу ресурсов будет перехватываться этим API-шлюзом и проверяет его сеанс пользователя также токен oauth2 из контекста сеанса. Все серверы ресурсов защищены Oauth2.
Мне необходимо поддерживать SAML2 login также через этот шлюз. Я настроил WSO2 в качестве поставщика удостоверений , который предоставляет ответ SAML в виде запроса POST на конечную точку в API-шлюзе после успешного входа пользователя через инициированный IDP поток входа в систему , Прямо сейчас WSO2 IDP может предоставить мне токен Oauth2, когда я отправляю запрос токена с утверждением SAML и типом предоставления SAML. Что мне нужно, это когда запрос SAML POST приходит от IDP WSO2 к шлюзу API, он должен создать токен Oauth2 из WSO2, используя утверждение SAML и тип предоставления SAML, а также создать сеанс Spring и контекст Oauth2 с этим полученным токеном Oauth2.
В настоящий момент у меня есть два возможных варианта:
1) Определить настраиваемый тип предоставления безопасности Oauth2 для пружин в клиенте api-gateway Oauth2 и обработать Ответ SAML для генерации токена Oauth2 с использованием Spring-Security, а также сеанса Spring и контекста Oauth2.
2) Вручную написать код для генерации токена Oauth2 с использованием ответа SAML, а также вручную создать новый сеанс Spring и контекст Oauth2, который будет уродливым подходом.
Ниже приведен текущий класс конфигурации безопасности.
@Configuration
@EnableOAuth2Sso
public class OAuth2LoginSecurityConfig extends WebSecurityConfigurerAdapter {
private static final String ROOT_PATH = "/";
private static final String SUFFIX = "**";
private static final String ANY_OTHER = "/webjars";
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.antMatcher(ROOT_PATH + SUFFIX)
.authorizeRequests()
.antMatchers(LOGIN_PATH.value() + SUFFIX, ERROR_PATH.value() + SUFFIX, ANY_OTHER + SUFFIX, "/saml**").permitAll()
.antMatchers(HttpMethod.POST, "/saml**").permitAll()
.anyRequest()
.authenticated()
.and().csrf().ignoringAntMatchers("/saml**")
.and().logout().logoutSuccessUrl(LOGOUT_SUCCESS_PATH.value()).permitAll();
}
@Bean
public OAuth2RestOperations restTemplate(OAuth2ClientContext clientContext, OAuth2ProtectedResourceDetails resourceDetails) {
return new OAuth2RestTemplate(resourceDetails, clientContext);
}
@SuppressWarnings({ "rawtypes", "unchecked" })
@Bean
public FilterRegistrationBean oauth2ClientFilterRedirectRegistration(OAuth2ClientContextFilter filter) {
FilterRegistrationBean registration = new FilterRegistrationBean();
registration.setFilter(filter);
registration.setOrder(-100);
return registration;
}
}
Ниже приведена конфигурация Yml
security:
basic:
enabled: false
oauth2:
client:
clientId: xxxx
clientSecret: xxxxx
accessTokenUri: http://localhost:9763/oauth2/token
userAuthorizationUri: http://localhost:9763/oauth2/authorize
scope: openid,email,name
resource:
userInfoUri: http://localhost:9763/oauth2/userinfo
jwk:
key-set-uri: http://localhost:9763/oauth2/jwks
Может кто-нибудь подсказать, как мы можем определить пользовательский весенний тип безопасности Oauth2 в клиенте Oauth2? Есть ли доступная документация для настройки того же самого? Поддерживает ли Spring-Security это требование?
Также есть ли другие решения для этого сценария? Любые предложения, пожалуйста.