Объедините базу данных и аутентификацию SAML в одном приложении, используя Spring Security - PullRequest
0 голосов
/ 13 апреля 2020

Я пытаюсь реализовать аутентификацию и авторизацию в приложении весенней загрузки (2.2.4) с использованием Spring Security (Spring-Security-Starter).

Вариант использования: На основе username Я хочу перенаправить пользователя для указанного c провайдера аутентификации

  • Если имя пользователя заканчивается на 'mit.com' Аутентифицировать пользователя с помощью базы данных (я использую hibernate) - Для этого я могу использовать SpringD UsertailService
  • Если имя пользователя заканчивается на 'einfochips.com' Аутентифицировать пользователя с использованием протокола SAML 2.0 - с использованием провайдера идентификации, такого как Okta, SSOCircle, OneLogin et c.

    Я не могу понять, как я могу это сделать. Я попытался использовать пользовательский фильтр, но не смог этого сделать.

Я просмотрел много статей, но не смог этого достичь.

Я написал ниже код для аутентификации, используя только SAML. Работает нормально. Взяв пользователя в okta idp для входа в систему.

package com.example.demo;

import static org.springframework.security.extensions.saml2.config.SAMLConfigurer.saml;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpMethod;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.saml.userdetails.SAMLUserDetailsService;

@EnableWebSecurity
@Configuration
@EnableGlobalMethodSecurity(securedEnabled = true)
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Autowired
    SAMLUserDetailsService userDetailsService;

    @Value("${security.saml2.metadata-url}")
    String metadataUrl;

    @Value("${server.ssl.key-alias}")
    String keyAlias;

    @Value("${server.ssl.key-store-password}")
    String password;

    @Value("${server.port}")
    String port;

    @Value("${server.ssl.key-store}")
    String keyStoreFilePath;   

    //Uisng SAML2.0
    @Override
    protected void configure(final HttpSecurity http) throws Exception {
        http.csrf().disable()
            .authorizeRequests()
                .antMatchers("/").permitAll()
                .anyRequest().authenticated()
                .and()
            .apply(saml())
                .serviceProvider()
                    .keyStore()
                        .storeFilePath(this.keyStoreFilePath)
                        .password(this.password)
                        .keyname(this.keyAlias)
                        .keyPassword(this.password)
                        .and()
                    .protocol("https")
                    .hostname(String.format("%s:%s", "localhost", this.port))
                    .basePath("/")
                    .and().userDetailsService(userDetailsService)
                .identityProvider()
                .metadataFilePath(this.metadataUrl);
    }

}

любой может подсказать мне, что я могу настроить таким образом, чтобы я мог использовать любой IDP, такой как okta, ssocircle, OneLogin et c.

1 Ответ

0 голосов
/ 27 апреля 2020

Использование Spring Security AuthenticationProvider для реализации нескольких пользовательских поставщиков аутентификации и регистрации их в соответствующем порядке (они оцениваются по порядку).

Пользовательский поставщик аутентификации базы данных

public class MitComAuthProvider implements AuthenticationProvider {
   public Authentication authenticate(Authentication auth) {
      // if user matches 'mit.com', auth with database
      // look up and auth
      // else return null (to try next auth provider)
   }
}

Пользовательский поставщик аутентификации SAML (поставляется с Spring Security и инструментами AuthenticationProvider).

public class EInfoChipsAuthProvider extends SAMLAuthenticationProvider {
   public Authentication authenticate(Authentication auth) {
      // if user matches 'einfochips.com', auth with SAML
      // super.authentication(auth)
      // else return null (to try next auth provider) or throw auth exception
   }
}

, затем зарегистрируйте обоих поставщиков аутентификации в WebSecurityConfigurerAdapter* 1015. *

public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

   @Autowired
   private MitComAuthProvider mitComAuthProvider;

   @Autowired
   private EInfoChipsAuthProvider eInfoChipsAuthProvider;

   public void configure(AuthenticationManagerBuilder auth) throws Exception {
       auth.authenticationProvider(mitComAuthProvider);
       auth.authenticationProvider(eInfoChipsAuthProvider);
   }

   ...
}
...