본문 바로가기

Backend Development/Spring boot

[Spring boot] Spring Security saml2.0 예제 분석 (spring-security-saml2-core)

필터 등록

/saml/config/WebSecurityConfig.java:87

@Bean
public FilterChainProxy samlFilter() throws Exception {
    List<SecurityFilterChain> chains = new ArrayList<>();
    
    // IDP에 등록한 Recipient URL and Destination URL로 인증 프로세스를 위한 필터
    chains.add(new DefaultSecurityFilterChain(new AntPathRequestMatcher("/saml/SSO/**"),
        samlWebSSOProcessingFilter()));
        
    // 등록한 IDP discovery를 위한 url 
    chains.add(new DefaultSecurityFilterChain(new AntPathRequestMatcher("/saml/discovery/**"),
        samlDiscovery()));
        
    // saml2.0 인증을 위한 entry point 설정 /saml/login url로 인증을 시작한다.
    chains.add(new DefaultSecurityFilterChain(new AntPathRequestMatcher("/saml/login/**"),
        samlEntryPoint));
        
    // logout 용 필터
    chains.add(new DefaultSecurityFilterChain(new AntPathRequestMatcher("/saml/logout/**"),
        samlLogoutFilter));
    
    chains.add(new DefaultSecurityFilterChain(new AntPathRequestMatcher("/saml/SingleLogout/**"),
        samlLogoutProcessingFilter));
    return new FilterChainProxy(chains);
}

 

application.properties 설정 내용

application.properties

saml.keystore.location=classpath:/saml/samlKeystore.jks
# Password for Java keystore and item therein
saml.keystore.password=nalle123
saml.keystore.alias=apollo

# SAML Entity ID extracted from top of SAML metadata file
# skkkms@naver.com/kim*******
# https://developer.okta.com/signup/
saml.idp=http://www.okta.com/exk4zqiuc310vWv5u5d7
saml.sp=okta
spring.main.allow-circular-references=true

 

인증 후 실행할 Handler 등록

/saml/config/SamlSecurityConfig.java:177

@Bean
@Qualifier("saml")
public SavedRequestAwareAuthenticationSuccessHandler successRedirectHandler() {

	// 인증 성공시 호출되는 핸들러. 성공후 /home 으로 가도록 설정되어있다.
    SavedRequestAwareAuthenticationSuccessHandler successRedirectHandler = new SavedRequestAwareAuthenticationSuccessHandler();
    successRedirectHandler.setDefaultTargetUrl("/home");
    return successRedirectHandler;
}

@Bean
@Qualifier("saml")
public SimpleUrlAuthenticationFailureHandler authenticationFailureHandler() {

	// 인증 실패시 호출되는 핸들러. 실패 시 /error 으로 가도록 설정되어있다.
    SimpleUrlAuthenticationFailureHandler failureHandler = new SimpleUrlAuthenticationFailureHandler();
    failureHandler.setUseForward(true);
    failureHandler.setDefaultFailureUrl("/error");
    return failureHandler;
}

 

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

    @Value("${saml.sp}")
    private String samlAudience; 
    //samAudiences는 메타데이터의 EntityId로서 okta에서 등록한 audince 명과 동일해야 인증 받을수

...
   
public MetadataGenerator metadataGenerator() {
    MetadataGenerator metadataGenerator = new MetadataGenerator();
    metadataGenerator.setEntityId(samlAudience);
    metadataGenerator.setExtendedMetadata(extendedMetadata);
    metadataGenerator.setIncludeDiscoveryExtension(false);
    metadataGenerator.setKeyManager(keyManager);
    return metadataGenerator;
}