1. ホーム

マイクロサービスの実践(I) OAUTH 2.0統一認証認可に基づくマイクロサービス基盤

2022-02-23 07:38:23
<パス

フィードのバージョンについては、https://blog.csdn.net/w1054993544/article/details/109361170 を参照してください。

1. アーキテクチャ図

技術チームの蓄積を経て、この先、いくつかの新しいプロジェクトでSpring Cloudの技術スタックを使っていく予定です。おおよそのマイクロサービス・アーキテクチャは以下の通りです。

  • ユーラカレジクラスター
  • Zuulゲートウェイクラスター
  • 各モジュールに対応したマイクロサービスクラスタ
  • Nginxによるロードバランシングの実装
  • Spring Cloud Config 統合コンフィギュレーションセンター
  • モニター マイクロサービス監視

コードの配信: https://github.com/babylikebird/Micro-Service-Skeleton

2. 登録センター

登録センターはシンプルなので、登録センターの高可用性構成のポイントを紹介します。

ここでは、node-1とnode-2という2つの設定ファイルを設定していますが、これはアプリを起動する際に別々の設定を起動するためのものです。
node-1のポートは9010で、以下の設定でnode-2に登録します。

server:
  port: 9010
spring:
  application:
    name: register ##name must be the same, otherwise high availability will result in unavailable-replicas
eureka:
  instance:
    hostname: register1
  client:
    register-with-eureka: true 
    fetch-registry: true 
    service-url:
      defaultZone: http://register2:9011/eureka/


node-2はポート9011を持ち、以下の構成でnode-1と登録します。

server:
  port: 9011
spring:
  application:
    name: register 
eureka:
  instance:
    hostname: register2
  client:
    register-with-eureka: true 
    fetch-registry: true 
    service-url:
      defaultZone: http://register1:9010/eureka/


ここで注意:spring.application.nameは同じでないと、unavailable-replicasが発生します。

3. OAUTH2認証サーバー

ここでは、リソースサーバーとは別の認証サーバーを使用しています。

3.1 oauth2サーバーの設定

トークンの保存方法には、データベースとredisの2種類があり、簡単に切り替えることができますが、世代交代が進む環境では、redisを使用することをお勧めします。
AuthorizationServerです。

@Configuration
@EnableAuthorizationServer
public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {

    @Autowired
    private AuthenticationManager authenticationManager;

    @Autowired
    private DataSource dataSource;
    @Autowired
    private UserDetailsServiceImpl userDetailsService;

    @Autowired
    private RedisConnectionFactory redisConnectionFactory;

    @Bean
    RedisTokenStore redisTokenStore(){
        return new RedisTokenStore(redisConnectionFactory);
    }

    // token store database
// @Bean
// public JdbcTokenStore jdbcTokenStore(){
// return new JdbcTokenStore(dataSource);
// }

    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients.withClientDetails(clientDetails());
    }
    @Bean
    public ClientDetailsService clientDetails() {
        return new JdbcClientDetailsService(dataSource);
    }
    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
        endpoints.tokenStore(redisTokenStore())
                .userDetailsService(userDetailsService)
                .authenticationManager(authenticationManager);
        endpoints.tokenServices(defaultTokenServices());
    }

    /**
     * <p> Note that when customizing TokenServices, you need to set @Primary, otherwise an error is reported, </p>
     * @return
     */
    @Primary
    @Bean
    public DefaultTokenServices defaultTokenServices(){
        DefaultTokenServices tokenServices = new DefaultTokenServices();
        tokenServices.setTokenStore(redisTokenStore());
        tokenServices.setSupportRefreshToken(true);
        tokenServices.setClientDetailsService(clientDetails());
        tokenServices.setAccessTokenValiditySeconds(60*60*12); // token validity custom setting, default 12 hours
        tokenServices.setRefreshTokenValiditySeconds(60 * 60 * 24 * 7); // default 30 days, modified here
        return tokenServices;
    }

    @Override
    public void configure(AuthorizationServerSecurityConfigurer security) throws Exception {
        security.tokenKeyAccess("permitAll()");
        security .checkTokenAccess("isAuthenticated()");
        security.allowFormAuthenticationForClients();
    }
}


WebSecurityConfigです。

@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Autowired
    private UserDetailsServiceImpl userDetailsService;

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    @Override
    @Bean
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return super.authenticationManagerBean();
    }
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService)
            .passwordEncoder(passwordEncoder());
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .authorizeRequests()
                .anyRequest().authenticated()
                .and()
                .formLogin().and()
                .csrf().disable()
                .httpBasic();
    }

    @Override
    public void configure(WebSecurity web) throws Exception {
        web.ignoring().antMatchers("/favor.ioc");
    }

}



3.2 ResourceServer

認証センターはユーザー情報を提供するので、リソースサーバーでもある。

@Configuration
@EnableResourceServer
public class ResourceServerConfig extends ResourceServerConfigurerAdapter{
    @Override
    public void configure(HttpSecurity http) throws Exception {
        http.
                csrf().disable()
                .exceptionHandling()
                .authenticationEntryPoint(new Http401AuthenticationEntryPoint("Bearer realm=\"webrealm\""))
                .and()
                .authorizeRequests().anyRequest().authenticated()
                .and()
                .httpBasic();
    }
}


4. リソース サーバー リソース

ResourceServerです。

@Configuration
@EnableResourceServer
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
    @Override
    public void configure(HttpSecurity http) throws Exception {
        http.
                csrf().disable()
                .exceptionHandling()
                .authenticationEntryPoint(new Http401AuthenticationEntryPoint("Bearer realm=\"webrealm\""))
                .and()
                .authorizeRequests().anyRequest().authenticated()
                .and()
                .httpBasic();
    }
}


メインはapplication.ymlの設定です。

security:
  oauth2:
    resource:
      id: resource
      user-info-uri: http://10.10.8.2:9030/uaa/user
      prefer-token-info: false


** user-info-uriは、後述する対応するゲートウェイアドレスです。また、上記のアーキテクチャ図では、負荷分散を実現するためにNginxを使用していますが、Nginxを使用する場合は、ゲートウェイが負荷分散を実現できるように、user-info-uriをNginxアドレスに置き換えています **
ここにエラーがあります。具体的にご覧ください。 Springクラウドマイクロサービスの活用 - OAUTH2.0ベースの統一認証認可 (V)

5. ズールゲートウェイ

5.1 Ssoのサポートをオンにする

@Configuration
@EnableOAuth2Sso
public class SecurityConfig extends WebSecurityConfigurerAdapter{

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable();
    }
}

spring:
  application:
    name: Gateway
  zipkin:
    base-url: http://10.10.8.2:9050
server:
  port: 9030
eureka:
  instance:
    prefer-ip-address: true #Register with IP
    instance-id: ${spring.cloud.client.ipAddress}:${server.port}
 
  client:
      service-url:
        defaultZone: http://register1:9010/eureka/,http://register2:9011/eureka/
###actuator monitoring points start####
endpoints:
  health:
    sensitive: false
    enabled: true
## By default many endpoints are not allowed to be accessed and will return 401:Unauthorized
management:
  security:
    enabled: false
###actuator monitoring point end####
zuul:
  host:
    connect-timeout-millis: 10000
    socket-timeout-millis: 60000
  routes:
    uaa:
      path: /uaa/**
      strip-prefix: true
      sensitiveHeaders:
      serviceId: auth2.0-center
security:
  basic:
    enabled: false
  oauth2:
    client:
      access-token-uri: http://10.10.8.2:9030/uaa/oauth/token ## address of the gateway
      user-authorization-uri: http://10.10.8.2:9030/uaa/oauth/authorize
    resource:
      user-info-uri: http://10.10.8.2:9030/uaa/user
      prefer-token-info: false
##############end #####################
#### timeout configuration ####
ribbon:
  ReadTimeout: 10000
  ConnectTimeout: 10000
  MaxAutoRetries: 1
  MaxAutoRetriesNextServer: 2
  eureka:
    enabled: true
hystrix:
  command:
    default:
      execution:
        timeout:
          enabled: true
        isolation:
          thread:
            timeoutInMilliseconds: 600000
###Timeout configuration###


5.2 コンフィギュレーション

spring:
  application:
    name: Gateway
  zipkin:
    base-url: http://10.10.8.2:9050
server:
  port: 9030
eureka:
  instance:
    prefer-ip-address: true #Register with IP
    instance-id: ${spring.cloud.client.ipAddress}:${server.port}
 
  client:
      service-url:
        defaultZone: http://register1:9010/eureka/,http://register2:9011/eureka/
###actuator monitoring points start####
endpoints:
  health:
    sensitive: false
    enabled: true
## By default many endpoints are not allowed to be accessed and will return 401:Unauthorized
management:
  security:
    enabled: false
###actuator monitoring point end####
zuul:
  host:
    connect-timeout-millis: 10000
    socket-timeout-millis: 60000
  routes:
    uaa:
      path: /uaa/**
      strip-prefix: true
      sensitiveHeaders:
      serviceId: auth2.0-center
security:
  basic:
    enabled: false
  oauth2:
    client:
      access-token-uri: http://10.10.8.2:9030/uaa/oauth/token ## address of the gateway
      user-authorization-uri: http://10.10.8.2:9030/uaa/oauth/authorize
    resource:
      user-info-uri: http://10.10.8.2:9030/uaa/user
      prefer-token-info: false
##############end #####################
#### timeout configuration ####
ribbon:
  ReadTimeout: 10000
  ConnectTimeout: 10000
  MaxAutoRetries: 1
  MaxAutoRetriesNextServer: 2
  eureka:
    enabled: true
hystrix:
  command:
    default:
      execution:
        timeout:
          enabled: true
        isolation:
          thread:
            timeoutInMilliseconds: 600000
###Timeout configuration###


6. 表示する

Register、Auth-center、Gateway、Resourceをそれぞれ起動します。その効果は次のとおりです。

6.1 access_tokenの取得


2.

3.

6.2 トークンのリフレッシュ

6.3 access_tokenを使ったリソースの取得

7. 終了

この時点でSpring Cloud OAUTH2.0 Unified Authenticationのスケルトンは完成しており、特定のプロジェクトが持ち込まれ、プロジェクトのニーズに合わせて修正されることになります。
大切なことは、あと3回言うこと。
ソースコードの配信
ソースコードの転送
ソースコードの転送