Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Spring Security 5.0 解剖速報

10,811 views

Published on

2017年11月24日のSpring Fest 2017での発表に使用した資料です.
WebFlux対応の内容は堅田さんに作成頂いたものですが,許可を得て公開しております.

Published in: Engineering
  • Be the first to comment

Spring Security 5.0 解剖速報

  1. 1. Copyright©2017 NTT corp. All Rights Reserved. Spring Security 5.0 解剖速報 2017年11⽉24⽇ Spring Fest 2017@KFC Hall & Rooms 岩塚 卓弥,堅⽥ 淳也 NTT ソフトウェアイノベーションセンタ
  2. 2. 2Copyright©2017 NTT corp. All Rights Reserved. • 名前:岩塚 卓弥 • 所属:NTT ソフトウェアイノベーションセンタ • NTTの研究所のうちソフトウェアを専⾨に扱う • ⾃部署ではソフトウェア⼯学を研究 • Springベースのグループ共通フレームワークの整備を担当 • Spring関連: • Spring I/O, SpringOne それぞれ2015年から参加 • 改訂新版 Spring⼊⾨,Spring徹底⼊⾨ レビュアー • JSUG幹事 Introduction
  3. 3. 3Copyright©2017 NTT corp. All Rights Reserved. • 名前:堅⽥ 淳也 • 所属:NTT ソフトウェアイノベーションセンタ • NTTの研究所のうちソフトウェアを専⾨に扱う • ⾃部署ではソフトウェア⼯学を研究 • Springベースのグループ共通フレームワークの整備を担当 • Spring経験 • 元SIerで、プロジェクトへのSpring適⽤⽀援などを担当 Introduction
  4. 4. 4Copyright©2017 NTT corp. All Rights Reserved. Spring Framework 5.0 Released! https://spring.io/blog/2017/09/28/spring-framework-5-0-goes-ga
  5. 5. 5Copyright©2017 NTT corp. All Rights Reserved. Spring Data “Kay” (2017/10/2) Spring Security 5.0 (2017/11/27) Spring Session 2.0 (2017/11/27) Spring Integration 5.0 Spring Batch 4.0 Spring Boot 2.0 Spring Cloud “Finchley” Major version up of the Spring Projects
  6. 6. 6Copyright©2017 NTT corp. All Rights Reserved. • WebFlux対応 Spring Securityが提供する各種Security Filter等を Spring Framework 5.0にて導⼊されたWeb Fluxに 対応させる • OAuth 2.0対応 OAuth 2.0/OpenID Connect による認証機能を追加 • 他 • PasswordEncoder周りの改善 Whatʼs new in the Spring Security 5.0
  7. 7. 7Copyright©2017 NTT corp. All Rights Reserved. WebFlux対応 Spring Security 5.0 解剖速報
  8. 8. 8Copyright©2017 NTT corp. All Rights Reserved. • Spring Framework 5.0 で追加された仕組み • リアクティブプログラミングをサポートする新しい Webフレームワーク • ⾮同期 & ノンブロッキングでリクエストを処理 • 少ないスレッドで多くリクエストを処理可能 • → システムリソースの節約 • クライアントの数が多い / 低速な場合に特に有効 • IoT • Mobile • Microservices What is WebFlux?
  9. 9. 9Copyright©2017 NTT corp. All Rights Reserved. Spring MVC vs Spring WebFlux @Controller, @RequestMapping spring-webmvc Servlet API Servlet Container spring-webflux HTTP / Reactive Streams Tomcat, Jetty, Netty, Undertow Router Functions Spring MVC の横に存在 Netty等のServlet以外の環境にも対応 → spring-webflux は Servlet API に依存しない
  10. 10. 10Copyright©2017 NTT corp. All Rights Reserved. • ControllerのメソッドからReactive Typeを返却 • Mono<T>・・・0個または1個の値を発⾏ • Flux<T>・・・0個以上の値を発⾏ Controller (WebFlux) @RestController public class UserController { @Autowired UserRepository userRepository; @GetMapping("/listAdult") public Flux<User> listAdult() { // 20歳以上のユーザを返す return userRepository.findAll() .filter(u -> u.getAge() >= 20); } } public interface UserRepository { Flux<User> findAll(); } /listAdult の結果
  11. 11. 11Copyright©2017 NTT corp. All Rights Reserved. • 従来のSpring SecurityはServlet APIに依存 • Servlet Filter • HttpSession • HttpServletRequest • HttpServletResponse ・・・ Spring Security WebFlux Support UsernamePassword AuthenticationFilter LogoutFilter ExceptionTranslation Filter SessionManagement Filter Request ・・・ クライアント Webアプリケーション内の リソース Servlet Filter群 Response WebFluxでは 使⽤できない
  12. 12. 12Copyright©2017 NTT corp. All Rights Reserved. Form-based Authentication (without WebFlux) <<interface>> Authentication Manager <<interface>> Authentication Provider Provider Manager <<interface>> Authentication SuccessHandler <<Servlet Filter>> UsernamePassword AuthenticationFilter HTTPリクエストからユーザ名と パスワードを取り出し、認証処理 を開始 認証処理の実装を提供するための インターフェース <<interface>> Authentication FailureHandler DaoAuthenticatin Provider UserDetails Service 認証処理を実⾏するための インターフェース データストアからユーザ 情報を取り出して認証処 理を⾏う実装クラス データストアからユーザ情報を取り 出すサービスインターフェース 認証成功時のハンドリング を⾏うインターフェース 認証失敗時のハンドリング を⾏うインターフェース AuthenticationManagerの 実装クラス
  13. 13. 13Copyright©2017 NTT corp. All Rights Reserved. Form-based Authentication (with WebFlux) ※Spring Security 5 RC1 で確認。正式リリースでは変更されている可能性があります <<interface>> Reactive Authentication Manager <<WebFilter>> Authentication WebFilter <<interface>> Server Authentication SuccessHandler <<interface>> Server Authentication FailureHandler <<Function>> ServerFormLogin Authentication Converter UserDetailsRepository ReactiveAuthentication Manager Reactive UserDetails Service
  14. 14. 14Copyright©2017 NTT corp. All Rights Reserved. Form-based Authentication (with WebFlux) ※Spring Security 5 RC1 で確認。正式リリースでは変更されている可能性があります <<interface>> Reactive Authentication Manager <<WebFilter>> Authentication WebFilter <<interface>> Server Authentication SuccessHandler <<interface>> Server Authentication FailureHandler <<Function>> ServerFormLogin Authentication Converter UserDetailsRepository ReactiveAuthentication Manager Reactive UserDetails Service • AuthenticationWebFilter • 認証を開始するWebFilter • WebFilter? • Spring Framework 5 で提供されるインターフェース • リアクティブ対応したServlet Filterのようなもの • Spring SecurityでServlet Filterとして実現していたクラス は基本的にWebFilterに置き換えられている public interface WebFilter { Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain); }
  15. 15. 15Copyright©2017 NTT corp. All Rights Reserved. Form-based Authentication (with WebFlux) ※Spring Security 5 RC1 で確認。正式リリースでは変更されている可能性があります <<interface>> Reactive Authentication Manager <<WebFilter>> Authentication WebFilter <<interface>> Server Authentication SuccessHandler <<interface>> Server Authentication FailureHandler <<Function>> ServerFormLogin Authentication Converter UserDetailsRepository ReactiveAuthentication Manager Reactive UserDetails Service • ServerFormLoginAuthenticationConverter • リクエストパラメータから認証情報(usernameとpassword)を抽出するFunction • 従来からクラスの役割分担が少し変わっている • 従来はFilterの中で認証情報の取得までやっていた • WebFlux対応では認証情報の取得⽅法に応じたAuthenticationConverterをセット • Basic認証の場合は ServerHttpBasicAuthenticationConverterをフィルタにセットする • フィルタはAuthenticationWebFilterから変えない
  16. 16. 16Copyright©2017 NTT corp. All Rights Reserved. Form-based Authentication (with WebFlux) ※Spring Security 5 RC1 で確認。正式リリースでは変更されている可能性があります <<interface>> Reactive Authentication Manager <<WebFilter>> Authentication WebFilter <<interface>> Server Authentication SuccessHandler <<interface>> Server Authentication FailureHandler <<Function>> ServerFormLogin Authentication Converter UserDetailsRepository ReactiveAuthentication Manager Reactive UserDetails Service • ReactiveAuthenticationManager • リアクティブ対応なAuthenticationManager public interface ReactiveAuthenticationManager { Mono<Authentication> authenticate(Authentication authentication); }
  17. 17. 17Copyright©2017 NTT corp. All Rights Reserved. Form-based Authentication (with WebFlux) ※Spring Security 5 RC1 で確認。正式リリースでは変更されている可能性があります <<interface>> Reactive Authentication Manager <<WebFilter>> Authentication WebFilter <<interface>> Server Authentication SuccessHandler <<interface>> Server Authentication FailureHandler <<Function>> ServerFormLogin Authentication Converter UserDetailsRepository ReactiveAuthentication Manager Reactive UserDetails Service • UserDetailsRepositoryReactiveAuth enticationManager • ユーザ情報を取得し、認証処理を実⾏ • 従来からクラスの役割分担が少し変 わっている • 従来はAuthenticationProviderというイン ターフェースが存在
  18. 18. 18Copyright©2017 NTT corp. All Rights Reserved. Form-based Authentication (with WebFlux) ※Spring Security 5 RC1 で確認。正式リリースでは変更されている可能性があります <<interface>> Reactive Authentication Manager <<WebFilter>> Authentication WebFilter <<interface>> Server Authentication SuccessHandler <<interface>> Server Authentication FailureHandler <<Function>> ServerFormLogin Authentication Converter UserDetailsRepository ReactiveAuthentication Manager Reactive UserDetails Service • ReactiveUserDetailsService • リアクティブ対応なUserDetailsService • メソッド名が微妙に変わっている • 従来はloadUserByUsername public interface ReactiveUserDetailsService { Mono<UserDetails> findByUsername(String username); }
  19. 19. 19Copyright©2017 NTT corp. All Rights Reserved. Form-based Authentication (with WebFlux) ※Spring Security 5 RC1 で確認。正式リリースでは変更されている可能性があります <<interface>> Reactive Authentication Manager <<WebFilter>> Authentication WebFilter <<interface>> Server Authentication SuccessHandler <<interface>> Server Authentication FailureHandler <<Function>> ServerFormLogin Authentication Converter UserDetailsRepository ReactiveAuthentication Manager Reactive UserDetails Service • ServerAuthenticationSuccessHandler • リアクティブ対応なAuthenticationSuccessHandler public interface ServerAuthenticationSuccessHandler { Mono<Void> onAuthenticationSuccess( WebFilterExchange webFilterExchange, Authentication authentication); } • ServerAuthenticationFailurHandler • リアクティブ対応なAuthenticationFailureHandler public interface ServerAuthenticationFailureHandler { Mono<Void> onAuthenticationFailure( WebFilterExchange webFilterExchange, AuthenticationException exception); }
  20. 20. 20Copyright©2017 NTT corp. All Rights Reserved. • 認可のクラス構成はあまり変わらない Authorization (with / without WebFlux) <<interface>> AccessDecision Manager <<Servlet Filter>> FilterSecurity Interceptor <<interface>> Authentication Entrypoint <<interface>> AccessDenied Handler <<Servlet Filter>> Exception TranslationFilter <<interface>> Reactive Authorization Manager <<WebFilter>> Authorization WebFilter <<interface>> Server Authentication Entrypoint <<interface>> Server AccessDenied Handler <<WebFilter>> Exception Translation WebFilter Spring MVC WebFlux FilterSecurityInterceptor ↓ AuthorizationWebFilter AccessDecisionManager ↓ ReactiveAuthorization Manager
  21. 21. 21Copyright©2017 NTT corp. All Rights Reserved. • 従来のアーキテクチャと⼤きくは同じ • WebFlux対応のインターフェースには接頭辞としてReactiveとか Serverが付与されている • AuthenticationManager → ReactiveAuthenticationManager • AuthenticationSuccessHandler → ServerAuthenticationSuccessHandler • ⼀部、クラスの役割分担が変更されているので注意 • ⼀部、インターフェース名が変わっているので対応を⾒つけにくいもの があるので注意 • 従来のServlet API依存のアーキテクチャがなくなるわけではない • Spring MVC と組み合わせるならこれまで通りのやり⽅でOK Note
  22. 22. 22Copyright©2017 NTT corp. All Rights Reserved. Reactive Security Configuration @Configuration @EnableWebFluxSecurity public class SimpleSecurityConfig { @Bean public MapReactiveUserDetailsService userDetailsRepository() { UserDetails user = User.withDefaultPasswordEncoder() .username("user") .password("password") .roles("USER") .build(); UserDetails admin = User.withDefaultPasswordEncoder() .username("admin") .password("admin") .roles("ADMIN", "USER") .build(); return new MapReactiveUserDetailsService(user, admin); } @EnableWebFluxSecurityを付与すること でWebFlux対応のSpring Securityを有効化 インメモリでユーザ情報を保持する ReactiveUserDetailsServiceをBean登録 (従来は InMemoryUserDetailsManager で設定) user, admin の2ユーザの UserDetailsを登録
  23. 23. 23Copyright©2017 NTT corp. All Rights Reserved. Reactive Security Configuration @Bean public SecurityWebFilterChain springSecurityFilterChain( ServerHttpSecurity http) { http .authorizeExchange() .pathMatchers("/resources/**").permitAll() .pathMatchers("/login").permitAll() .pathMatchers("/admin").hasRole("ADMIN") .anyExchange().authenticated() .and() .formLogin() .loginPage("/login"); return http.build(); } } SecurityFilterChainインターフェースのWebFilter版 HttpSecurityクラスのリアクティブ対応版 従来は authorizeRequests() 従来は antMatchers(..) 最後にbuild()メソッドを呼ぶ
  24. 24. 24Copyright©2017 NTT corp. All Rights Reserved. • WebTestClient (Spring Framework 5 より) • Spring Framework 5.0 より追加されたテスト⽤のクラス • WebFluxのエンドポイントをテストできる • サーバを実⾏しても、実⾏しなくてもテスト可能 • Spring MVCのControllerテスト⽤のMockMvcに相当 • ただし、MockMvcは実⾏サーバ上のテストには使えない • @WithMockUser (Spring Security 4 より) • 単体テスト時にアノテーションでユーザ情報を設定可能 • MockMvcと組み合わせて認証区間内のControllerの試験が可能 WebTestClient Support Spring Security 5 では、@WithMockUser が WebTestClient に対応
  25. 25. 25Copyright©2017 NTT corp. All Rights Reserved. WebTestClient Support @RunWith(SpringRunner.class) @ContextConfiguration(classes = SpringSecurityDemo.class) public class WebSecurityTest { @Autowired ApplicationContext context; WebTestClient client; @Before public void setUp() { client = WebTestClient .bindToApplicationContext(context) .apply(springSecurity()) .configureClient() .build(); } テスト⽤のアノテーションを指定 コンテキストをインジェクション (WebApplicationContextではない) WebTestClientのセットアップ Spring Securityのテストサポート機能を適⽤するために、 SecurityMockServerConfigurersのstaticメソッドを呼ぶ (MockMvcで使⽤するSecurityMockMvcConfigurersの staticメソッドはない)
  26. 26. 26Copyright©2017 NTT corp. All Rights Reserved. WebTestClient Support @WithMockUser(roles = "USER") @Test public void testPermission01() throws Exception { client .get() .uri("/") .exchange() .expectStatus().is2xxSuccessful(); } @Test public void testPermission02() throws Exception { client .get() .uri("/") .exchange() .expectStatus().isFound() .expectHeader().valueEquals("Location", "/login"); } USERロールでログインした状態でテストする ログインしないとアクセスできないURLへアクセス ステータスコード200番台で アクセス成功するかチェック 未ログイン状態でテストする (@WithMockUserを付与しない) ログインページ(/login)へリダイレクト されることをチェック
  27. 27. 27Copyright©2017 NTT corp. All Rights Reserved. WebTestClient Support @WithMockUser(roles = "USER") @Test public void testCsrf() throws Exception { client .mutateWith(csrf()) .post() .uri("/") .exchange() .expectStatus().is2xxSuccessful(); CSRF対策を有効化している場合は、 SecurityMockServerConfigurersのstaticメソッド を呼び、mutateWithメソッドに渡す
  28. 28. 28Copyright©2017 NTT corp. All Rights Reserved. Reactive Method Security @Configuration @EnableWebFluxSecurity @EnableReactiveMethodSecurity public class SecurityConfig { JavaConfigクラスに @EnableReactiveMethodSecurityを付与 @Service public class WelcomeServiceImpl implements WelcomeService { @PreAuthorize("hasRole('ADMIN')") public Mono<String> helloAdmin() { return Mono.just("Hello Admin!"); } } リアクティブなメソッドにADMIN ロールをチェックするアノテーション を追加
  29. 29. 29Copyright©2017 NTT corp. All Rights Reserved. Reactive Method Security (Test) @RunWith(SpringRunner.class) @ContextConfiguration(classes = SpringSecurityDemo.class) public class WelcomeServiceImplTest { @Autowired WelcomeService target; @WithMockUser(roles = "ADMIN") @Test public void testHelloAdmin() { Mono<String> message = target.helloAdmin(); StepVerifier .create(message) .expectNext("Hello Admin") .verifyComplete(); } リアクティブなメソッドのテスト にも@WithMockUserを使える
  30. 30. 30Copyright©2017 NTT corp. All Rights Reserved. • 従来提供されていたが、WebFlux対応では実装されていない機能 もたくさんある模様 • 認証イベント通知 • 従来は@EventListenerで通知を受け取れた • AuthenticationSuccessEvent • AuthenticationFailureBadCredentialsEvent • etc… • Remember-Me • セッションタイムアウトを越えて⻑期間ログイン状態を保持する機能 • AuthenticationProviderとして提供されていた各種実装クラス相当 • DaoAuthenticationProvider • PreAuthenticatedAuthenticationProvider • など • LogoutHandlerの実装として提供されていた各種実装クラス相当 • CSRFトークンの削除を⾏うハンドラ • WebSessionのinvalidateを⾏うハンドラ • etc・・・ Note →これらは5.1.0で実装予定
  31. 31. 31Copyright©2017 NTT corp. All Rights Reserved. • 従来は簡易なログインページが⾃動⽣成される Default Login Page
  32. 32. 32Copyright©2017 NTT corp. All Rights Reserved. • WebFlux対応だとデフォルトログインページがちょっ とリッチになる Default Login Page (with WebFlux) Spring Security 5 + Spring MVC Spring Security 5 + Spring WebFlux LoginPageGeneratingWebFilterがHTMLを⽣成 DefaultLoginPageGeneratingFilterがHTMLを⽣成 Bootstrap 4.0.0-beta をインターネット経由で使⽤ <title>Please sign in</title> <link href="https://maxcdn.bootstrapcdn.com /bootst rap /4.0.0-beta /css /bootstrap.min.css"
  33. 33. 33Copyright©2017 NTT corp. All Rights Reserved. • WebFlux対応だとログアウトページも⾃動⽣成される • 従来にはないNew Feature • ⽣成条件 • フォーム認証の設定で、loginPageを指定せずにログインペー ジを⾃動⽣成させるようにする • GETで/logoutへアクセス Default Logout Page (with WebFlux) LogoutPageGeneratingWebFilterがHTMLを⽣成 @Bean public SecurityWebFilterChain springSecurityFilterChain( ServerHttpSecurity http) { http .authorizeExchange() .anyExchange().authenticated() .and() .formLogin(); return http.build(); }
  34. 34. 34Copyright©2017 NTT corp. All Rights Reserved. OAuth 2.0対応 Spring Security 5.0 解剖速報
  35. 35. 35Copyright©2017 NTT corp. All Rights Reserved. Review : OAuth 2.0 Resource Owner (エンドユーザ等) Client (サードパーティ製 アプリ等) Authorization Server Resource Server (Webサービス等) Protected Resource A Client の権限を限定して Protected Resource に アクセスさせるための認可フレームワーク Protected Resource B Protected Resource C AとBの 権限を要求 (認可リクエスト)
  36. 36. 36Copyright©2017 NTT corp. All Rights Reserved. Review : OAuth 2.0 Resource Owner (エンドユーザ等) Client (サードパーティ製 アプリ等) Authorization Server Resource Server (Webサービス等) Protected Resource A Client の権限を限定して Protected Resource に アクセスさせるための認可フレームワーク Protected Resource B Protected Resource C 許可をとる Access Token を渡す*注 *注 Authorization Code Flowにおける Authorization Codeのやり取りの説明は割愛
  37. 37. 37Copyright©2017 NTT corp. All Rights Reserved. Review : OAuth 2.0 Resource Owner (エンドユーザ等) Client (サードパーティ製 アプリ等) Authorization Server Resource Server (Webサービス等) Protected Resource A Client の権限を限定して Protected Resource に アクセスさせるための認可フレームワーク Protected Resource B Protected Resource C Access Token を使う
  38. 38. 38Copyright©2017 NTT corp. All Rights Reserved. • Spring Social • 各種SNSへのアクセスのためにClient機能を独⾃実装 • Spring Security OAuth • Authorization Server, Resource Server, Clientの機能を 実装するためのライブラリ • Spring Boot • Spring Security OAuthを利⽤したSSO機能の提供 • Spring Cloud Security • トークンリレー機能の提供 OAuth 2.0 in Spring Spring Security 5 で OAuth 2.0 をサポートし, 各プロジェクトはそれを使⽤する形に書き換えていく Spring Security OAuth はメンテナンスモードへ(今後の機能追加なし)
  39. 39. 39Copyright©2017 NTT corp. All Rights Reserved. Implementation scope Resource Owner (エンドユーザ等) Client (サードパーティ製 アプリ等) Authorization Server Resource Server (Webサービス等) Protected Resource A Protected Resource B Protected Resource C 5.0では OAuth 2.0 / OpenID Connectによる 「認証機能(Client)」を実装 5.1で 提供予定 提供時期 不明 5.0で 「認証機能」提供
  40. 40. 40Copyright©2017 NTT corp. All Rights Reserved. Review : OpenID Connect End-User Relying Party (Client) OpenID Provider (Authorization Server) UserInfo Endpoint OAuth 2.0 を認証に使⽤するために拡張したプロトコル 認証リクエスト
  41. 41. 41Copyright©2017 NTT corp. All Rights Reserved. Review : OpenID Connect End-User Relying Party (Client) OpenID Provider (Authorization Server) UserInfo Endpoint OAuth 2.0 を認証に使⽤するために拡張したプロトコル 認証する Access Token と ID Token を渡す*注 *注 ここでもAuthorization Codeのやり取りの説明は割愛 ID Tokenを 検証する
  42. 42. 42Copyright©2017 NTT corp. All Rights Reserved. Review : OpenID Connect End-User Relying Party (Client) OpenID Provider (Authorization Server) UserInfo Endpoint OAuth 2.0 を認証に使⽤するために拡張したプロトコル Access Token を使う ユーザプロフィールを渡す
  43. 43. 43Copyright©2017 NTT corp. All Rights Reserved. OAuth 2.0のサービスプロバイダがOpenID Connectに ⾮対応の場合 → Access Tokenで取得したユーザIDで認証する*注 Authentication with OAuth 2.0?? *注 詳細は割愛するが,⼀般にOAuth 2.0は認証⽬的のプロトコルではないため 実装によってはなりすまし攻撃等のセキュリティリスクが有ることに注意すること Spring Security 5.0では両⽅をサポート インタフェースは共通でそれぞれに実装を⽤意
  44. 44. 44Copyright©2017 NTT corp. All Rights Reserved. Overview of OIDC with Spring Security Client情報 Endpoint情報 Spring Security 認証機構 End-User OpenID Provider (Authorization Server) UserInfo Endpoint Security Filter 予めClientの情報と 各種Endpointの情報を 設定しておく
  45. 45. 45Copyright©2017 NTT corp. All Rights Reserved. Overview of OIDC with Spring Security Client情報 Endpoint情報 Spring Security 認証機構 End-User OpenID Provider (Authorization Server) UserInfo Endpoint Security Filter Authorization Endpointへ リダイレクト ログイン試⾏
  46. 46. 46Copyright©2017 NTT corp. All Rights Reserved. Overview of OIDC with Spring Security Client情報 Endpoint情報 Spring Security 認証機構 End-User OpenID Provider (Authorization Server) UserInfo Endpoint Security Filter 認証
  47. 47. 47Copyright©2017 NTT corp. All Rights Reserved. Overview of OIDC with Spring Security Client情報 Endpoint情報 Spring Security 認証機構 End-User OpenID Provider (Authorization Server) UserInfo Endpoint Security Filter 指定されたRedirect URIへ リダイレクト 認証処理を 委譲
  48. 48. 48Copyright©2017 NTT corp. All Rights Reserved. Overview of OIDC with Spring Security Client情報 Endpoint情報 Spring Security 認証機構 End-User OpenID Provider (Authorization Server) UserInfo Endpoint Security Filter Token Endpointに リクエスト送信 Access Tokenと ID Tokenを取得
  49. 49. 49Copyright©2017 NTT corp. All Rights Reserved. Overview of OIDC with Spring Security Client情報 Endpoint情報 Spring Security 認証機構 End-User OpenID Provider (Authorization Server) UserInfo Endpoint Security Filter 検証⽤公開鍵(JWK Set)を リクエスト JWK Setを取得 ID Tokenを検証
  50. 50. 50Copyright©2017 NTT corp. All Rights Reserved. Overview of OIDC with Spring Security Client情報 Endpoint情報 Spring Security 認証機構 End-User OpenID Provider (Authorization Server) UserInfo Endpoint Security Filter リクエスト ユーザプロフィールを取得
  51. 51. 51Copyright©2017 NTT corp. All Rights Reserved. Overview of OIDC with Spring Security Client情報 Endpoint情報 Spring Security 認証機構 End-User OpenID Provider (Authorization Server) UserInfo Endpoint Security Filter ユーザ情報作成 認証済みユーザとして セッションに格納
  52. 52. 52Copyright©2017 NTT corp. All Rights Reserved. Overview of OIDC with Spring Security Client情報 Endpoint情報 Spring Security 認証機構 End-User OpenID Provider (Authorization Server) UserInfo Endpoint Security Filter 予めClientの情報と 各種Endpointの情報を 設定しておく
  53. 53. 53Copyright©2017 NTT corp. All Rights Reserved. Client / Provider Management <<interface>> ClientRegistrationRepository ClientRegistration ClientRegistration. ProviderDetails ClientRegistration ClientRegistration. ProviderDetails ClientRegistration ClientRegistration. ProviderDetails Client情報 各種Endpoint情報 Load
  54. 54. 54Copyright©2017 NTT corp. All Rights Reserved. • ClientRegistrationのID (registerID) • Client名 • Client ID • Client Secret • Clientの認証⽅法 (Basic or Post) • Grant Type (Authorization Code or Implicit) • End-User認証後のRedirect URI • 要求するScope ClientRegistration
  55. 55. 55Copyright©2017 NTT corp. All Rights Reserved. • Authorization Endpoint • Token Endpoint • UserInfo Endpoint • End-UserのIDを取得するための属性名 • 公開鍵(JWK Set)取得⽤のEndpoint ProviderDetails
  56. 56. 56Copyright©2017 NTT corp. All Rights Reserved. Overview of OIDC with Spring Security Client情報 Endpoint情報 Spring Security 認証機構 End-User OpenID Provider (Authorization Server) UserInfo Endpoint Security Filter Authorization Endpointへ リダイレクト ログイン試⾏
  57. 57. 57Copyright©2017 NTT corp. All Rights Reserved. Authorization Request (Authentication Request) OAuth2Authorization RequestRedirectFilter Request <<interface>> ClientRegistrationRepository /oauth2/authorization/{registerID} への リクエストをハンドリング(URLは変更可) Rediret Client / Endpoint情報を提供 Authorization Requestを作成
  58. 58. 58Copyright©2017 NTT corp. All Rights Reserved. Overview of OIDC with Spring Security Client情報 Endpoint情報 Spring Security 認証機構 End-User OpenID Provider (Authorization Server) UserInfo Endpoint Security Filter 指定されたRedirect URIへ リダイレクト 認証処理を 委譲
  59. 59. 59Copyright©2017 NTT corp. All Rights Reserved. Review : Authentication with Spring Security <<interface>> AuthenticationManager ProviderManager <<interface>> AuthenticationProvider AuthenticationProviderの 実装クラス AuthenticationProviderの 実装クラス AuthenticationProviderの 実装クラス AuthenticationFilter Request リクエストを ハンドリング 認証処理を実施 認証処理を委譲
  60. 60. 60Copyright©2017 NTT corp. All Rights Reserved. Authentication with OIDC / OAuth 2.0 <<interface>> AuthenticationManager ProviderManager <<interface>> AuthenticationProvider OAuth2Login AuthenticationFilter Request /login/oauth2/code/* への リクエストをハンドリング (URLは変更可) OidcAuthorizationCode AuthenticationProvider OAuth2Login AuthenticationProvider OpenID Connect⽤ OAuth 2.0⽤
  61. 61. 61Copyright©2017 NTT corp. All Rights Reserved. Overview of OIDC with Spring Security Client情報 Endpoint情報 Spring Security 認証機構 End-User OpenID Provider (Authorization Server) UserInfo Endpoint Security Filter ユーザ情報作成 認証済みユーザとして セッションに格納
  62. 62. 62Copyright©2017 NTT corp. All Rights Reserved. OAuth2User <<interface>> AuthenticatedPrincipal <<interface>> OAuth2User DefaultOAuth2User <<interface>> OidcUser DefaultOidcUser OAuth 2.0⽤ OpenID Connect⽤ UserInfo, ID Token等を持つ
  63. 63. 63Copyright©2017 NTT corp. All Rights Reserved. Save authenticated user information OAuth2Login AuthenticationFilter <<interface>> OAuth2AuthorizedClientService OAuth2AuthenticationTokenOAuth2AuthorizedClient OAuth2AccessToken Save Save SecurityContextから 取得できるようになる OAuth2AuthorizedClientService経由で 取得できるようになる <<interface>> OAuth2User
  64. 64. 64Copyright©2017 NTT corp. All Rights Reserved. 1. 以下の依存ライブラリを追加 (pom.xml等) • spring-boot-starter-web • pring-security-config • pring-security-oauth2-client • pring-security-oauth2-jose 2. Client情報,Endpoint情報の設定 (application.yml 等) • spring.security.oauth2.client.registration.{registrationId}の 下にClient情報を設定 • spring.security.oauth2.client.provider.{providerId}の下に Endpoint情報を設定 • Facebook, Google, GitHub, Oktaの場合は設定不要 Use OIDC with Spring Boot AutoConfigurationでデフォルトのBeanが作成される
  65. 65. 65Copyright©2017 NTT corp. All Rights Reserved. • ログインページのカスタマイズ • InMemory実装の置換 • GrantedAuthorityのカスタマイズ Customize points
  66. 66. 66Copyright©2017 NTT corp. All Rights Reserved. Customize login page 1. WebSecurityConfigurerAdapter を拡張して設定 2. Controllerの実装 3. ログインページの実装
  67. 67. 67Copyright©2017 NTT corp. All Rights Reserved. • ClientRegistrationRepository • デフォルト実装は InMemoryClientRegistrationRepository • Client情報が固定ならばInMemory実装のままでもあ まり困らないかもしれない • OAuth2AuthorizedClientService • デフォルト実装は InMemoryOAuth2AuthorizedClientService • 認証済みユーザのAccess Tokenの管理を外部化する ためには独⾃で実装が必要となる Replace InMemory implementation
  68. 68. 68Copyright©2017 NTT corp. All Rights Reserved. デフォルトでは認証済みユーザの権限 (Role) は⼀律で “USER” に設定される Customize GrantedAuthority (1/2) <<interface>> GrantedAuthority OidcUserAuthority OAuth2UserAuthority OAuth 2.0⽤ OpenID Connect⽤ UserInfo Endpoint から取得したプロフィール情報や ID Token の情報が格納されている
  69. 69. 69Copyright©2017 NTT corp. All Rights Reserved. 1. GrantedAuthoritiesMapper の実装を作成 2. WebSecurityConfigurerAdapter を拡張して設定 Customize GrantedAuthority (2/2)
  70. 70. 70Copyright©2017 NTT corp. All Rights Reserved. その他の改善 Spring Security 5.0 解剖速報
  71. 71. 71Copyright©2017 NTT corp. All Rights Reserved. • CoreモジュールのPasswordEncoderの削除 • 従来からDeprecatedだった • CryptoモジュールのPasswordEncoderを使えば良い • DelegatingPasswordEncoderの追加 • パスワードのハッシュ化のアルゴリズムごとに適切な PasswordEncoderに処理を委譲する • ハッシュの先頭にアルゴリズムを指定するキーワードの付与が必要 • DaoAuthenticationProviderではデフォルトで使⽤される Improvement of PasswordEncoder
  72. 72. 72Copyright©2017 NTT corp. All Rights Reserved. DelegatingPasswordEncoder {algorithm}xxxxxxxxxxxxxxxxxx ハッシュ値アルゴリズムのID デフォルトで設定されているアルゴリズムの例 デフォルトではBCryptPasswordEncoderを使⽤して ハッシュ化する アルゴリズムのID PasswordEncoder bcrypt BCryptPasswordEncoder sha256 StandardPasswordEncoder MD5 MessageDigestPasswordEncoder(“MD5”) ldap LdapShaPasswordEncoder

×