|
3 | 3 | import com.ctrip.framework.apollo.common.condition.ConditionalOnMissingProfile; |
4 | 4 | import com.ctrip.framework.apollo.core.utils.StringUtils; |
5 | 5 | import com.ctrip.framework.apollo.portal.component.config.PortalConfig; |
| 6 | +import com.ctrip.framework.apollo.portal.repository.UserRepository; |
6 | 7 | import com.ctrip.framework.apollo.portal.spi.LogoutHandler; |
7 | 8 | import com.ctrip.framework.apollo.portal.spi.SsoHeartbeatHandler; |
8 | 9 | import com.ctrip.framework.apollo.portal.spi.UserInfoHolder; |
|
18 | 19 | import com.ctrip.framework.apollo.portal.spi.ldap.ApolloLdapAuthenticationProvider; |
19 | 20 | import com.ctrip.framework.apollo.portal.spi.ldap.FilterLdapByGroupUserSearch; |
20 | 21 | import com.ctrip.framework.apollo.portal.spi.ldap.LdapUserService; |
| 22 | +import com.ctrip.framework.apollo.portal.spi.oidc.ExcludeClientCredentialsClientRegistrationRepository; |
| 23 | +import com.ctrip.framework.apollo.portal.spi.oidc.OidcAuthenticationSuccessEventListener; |
| 24 | +import com.ctrip.framework.apollo.portal.spi.oidc.OidcLocalUserService; |
| 25 | +import com.ctrip.framework.apollo.portal.spi.oidc.OidcLogoutHandler; |
| 26 | +import com.ctrip.framework.apollo.portal.spi.oidc.OidcUserInfoHolder; |
21 | 27 | import com.ctrip.framework.apollo.portal.spi.springsecurity.SpringSecurityUserInfoHolder; |
22 | 28 | import com.ctrip.framework.apollo.portal.spi.springsecurity.SpringSecurityUserService; |
23 | 29 | import com.google.common.collect.Maps; |
24 | 30 | import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; |
| 31 | +import org.springframework.boot.autoconfigure.security.oauth2.client.OAuth2ClientProperties; |
| 32 | +import org.springframework.boot.autoconfigure.security.oauth2.resource.OAuth2ResourceServerProperties; |
25 | 33 | import org.springframework.boot.context.properties.EnableConfigurationProperties; |
26 | 34 | import org.springframework.boot.web.servlet.FilterRegistrationBean; |
27 | 35 | import org.springframework.boot.web.servlet.ServletListenerRegistrationBean; |
|
44 | 52 | import org.springframework.security.ldap.authentication.LdapAuthenticationProvider; |
45 | 53 | import org.springframework.security.ldap.search.FilterBasedLdapUserSearch; |
46 | 54 | import org.springframework.security.ldap.userdetails.DefaultLdapAuthoritiesPopulator; |
| 55 | +import org.springframework.security.oauth2.client.oidc.web.logout.OidcClientInitiatedLogoutSuccessHandler; |
| 56 | +import org.springframework.security.oauth2.client.registration.InMemoryClientRegistrationRepository; |
47 | 57 | import org.springframework.security.provisioning.JdbcUserDetailsManager; |
48 | 58 | import org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint; |
49 | 59 |
|
@@ -421,11 +431,95 @@ protected void configure(AuthenticationManagerBuilder auth) throws Exception { |
421 | 431 | } |
422 | 432 | } |
423 | 433 |
|
| 434 | + @Profile("oidc") |
| 435 | + @EnableConfigurationProperties({OAuth2ClientProperties.class, OAuth2ResourceServerProperties.class}) |
| 436 | + @Configuration |
| 437 | + static class OidcAuthAutoConfiguration { |
| 438 | + |
| 439 | + @Bean |
| 440 | + @ConditionalOnMissingBean(SsoHeartbeatHandler.class) |
| 441 | + public SsoHeartbeatHandler defaultSsoHeartbeatHandler() { |
| 442 | + return new DefaultSsoHeartbeatHandler(); |
| 443 | + } |
| 444 | + |
| 445 | + @Bean |
| 446 | + @ConditionalOnMissingBean(UserInfoHolder.class) |
| 447 | + public UserInfoHolder oidcUserInfoHolder() { |
| 448 | + return new OidcUserInfoHolder(); |
| 449 | + } |
| 450 | + |
| 451 | + @Bean |
| 452 | + @ConditionalOnMissingBean(LogoutHandler.class) |
| 453 | + public LogoutHandler oidcLogoutHandler() { |
| 454 | + return new OidcLogoutHandler(); |
| 455 | + } |
| 456 | + |
| 457 | + @Bean |
| 458 | + @ConditionalOnMissingBean(JdbcUserDetailsManager.class) |
| 459 | + public JdbcUserDetailsManager jdbcUserDetailsManager(AuthenticationManagerBuilder auth, |
| 460 | + DataSource datasource) throws Exception { |
| 461 | + return new SpringSecurityAuthAutoConfiguration().jdbcUserDetailsManager(auth, datasource); |
| 462 | + } |
| 463 | + |
| 464 | + @Bean |
| 465 | + @ConditionalOnMissingBean(UserService.class) |
| 466 | + public OidcLocalUserService oidcLocalUserService(JdbcUserDetailsManager userDetailsManager, |
| 467 | + UserRepository userRepository) { |
| 468 | + return new OidcLocalUserService(userDetailsManager, userRepository); |
| 469 | + } |
| 470 | + |
| 471 | + @Bean |
| 472 | + public OidcAuthenticationSuccessEventListener oidcAuthenticationSuccessEventListener(OidcLocalUserService oidcLocalUserService) { |
| 473 | + return new OidcAuthenticationSuccessEventListener(oidcLocalUserService); |
| 474 | + } |
| 475 | + } |
| 476 | + |
| 477 | + @Profile("oidc") |
| 478 | + @EnableWebSecurity |
| 479 | + @EnableGlobalMethodSecurity(prePostEnabled = true) |
| 480 | + @Configuration |
| 481 | + static class OidcWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter { |
| 482 | + |
| 483 | + private final InMemoryClientRegistrationRepository clientRegistrationRepository; |
| 484 | + |
| 485 | + private final OAuth2ResourceServerProperties oauth2ResourceServerProperties; |
| 486 | + |
| 487 | + public OidcWebSecurityConfigurerAdapter( |
| 488 | + InMemoryClientRegistrationRepository clientRegistrationRepository, |
| 489 | + OAuth2ResourceServerProperties oauth2ResourceServerProperties) { |
| 490 | + this.clientRegistrationRepository = clientRegistrationRepository; |
| 491 | + this.oauth2ResourceServerProperties = oauth2ResourceServerProperties; |
| 492 | + } |
| 493 | + |
| 494 | + @Override |
| 495 | + protected void configure(HttpSecurity http) throws Exception { |
| 496 | + http.csrf().disable(); |
| 497 | + http.authorizeRequests(requests -> requests.antMatchers(BY_PASS_URLS).permitAll()); |
| 498 | + http.authorizeRequests(requests -> requests.anyRequest().authenticated()); |
| 499 | + http.oauth2Login(configure -> |
| 500 | + configure.clientRegistrationRepository( |
| 501 | + new ExcludeClientCredentialsClientRegistrationRepository( |
| 502 | + this.clientRegistrationRepository))); |
| 503 | + http.oauth2Client(); |
| 504 | + http.logout(configure -> { |
| 505 | + OidcClientInitiatedLogoutSuccessHandler logoutSuccessHandler = new OidcClientInitiatedLogoutSuccessHandler( |
| 506 | + this.clientRegistrationRepository); |
| 507 | + logoutSuccessHandler.setPostLogoutRedirectUri("{baseUrl}"); |
| 508 | + configure.logoutSuccessHandler(logoutSuccessHandler); |
| 509 | + }); |
| 510 | + // make jwt optional |
| 511 | + String jwtIssuerUri = this.oauth2ResourceServerProperties.getJwt().getIssuerUri(); |
| 512 | + if (!StringUtils.isBlank(jwtIssuerUri)) { |
| 513 | + http.oauth2ResourceServer().jwt(); |
| 514 | + } |
| 515 | + } |
| 516 | + } |
| 517 | + |
424 | 518 | /** |
425 | 519 | * default profile |
426 | 520 | */ |
427 | 521 | @Configuration |
428 | | - @ConditionalOnMissingProfile({"ctrip", "auth", "ldap"}) |
| 522 | + @ConditionalOnMissingProfile({"ctrip", "auth", "ldap", "oidc"}) |
429 | 523 | static class DefaultAuthAutoConfiguration { |
430 | 524 |
|
431 | 525 | @Bean |
@@ -453,7 +547,7 @@ public UserService defaultUserService() { |
453 | 547 | } |
454 | 548 | } |
455 | 549 |
|
456 | | - @ConditionalOnMissingProfile({"auth", "ldap"}) |
| 550 | + @ConditionalOnMissingProfile({"auth", "ldap", "oidc"}) |
457 | 551 | @Configuration |
458 | 552 | @EnableWebSecurity |
459 | 553 | @EnableGlobalMethodSecurity(prePostEnabled = true) |
|
0 commit comments