マイクロサービスの実践(I) OAUTH 2.0統一認証認可に基づくマイクロサービス基盤
フィードのバージョンについては、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回言うこと。
ソースコードの配信
ソースコードの転送
ソースコードの転送
関連
-
MFCフレームワーク_CRT_SECURE_NO_WARNINGS問題解決
-
非静的フィールドへの静的参照はできない
-
エラー]ldが1終了ステータスを返した場合の解決策
-
2013 - 「初期通信パケットの読み込み」で MySQL サーバーへの接続が失われ、システムエラーが発生しました。0
-
Mac コンソールのアイデア mvn コマンドが見つかりません。
-
アプリケーションのPagerAdapterがPagerAdapter#notifyDatを呼び出さずにアダプタの内容を変更しました。
-
sourceTree solution マージする前に、変更をコミットするか、隠しておいてください。
-
java.security.cert.CertPathValidatorException を解決してください。認証パスのトラストアンカーが見つかりませんでした。
-
pycharmの未解決参照に対する解決策
-
Matplotlib のプロットと可視化 いくつかのプロパティとエラー
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
解決済み VMの初期化中にエラーが発生しました java/lang/NoClassDefFoundError: java/lang/O...
-
c++のエラーエラー: "***"の前に期待される初期化子
-
NoClassDefFoundError: org/hamcrest/SelfDescribing JUnit-4.11でエラー。
-
解決方法: 'chromedriver' 実行ファイルが PATH に存在する必要があります。
-
python: Image という名前のモジュールがない
-
ImportError: virtualenv を使用して仮想環境を作成する際に、urllib3 という名前のモジュールがないエラーが発生します。
-
Vue プロジェクトの Heroku デプロイメントに失敗する: sh: 1: vue-cli-service: 見つからない
-
[Python Basic] ValueError: 非キーワード引数は2つしか受け付けません。
-
MNISTの読み込みに失敗しました。[WinError 10060] コネクタがしばらくして正しく応答しなくなったため 解決策
-
Javaでnacosにログインし、設定を変更して公開する。