Spring Security 5.0 解剖速報

72
Copyright©2017 NTT corp. All Rights Reserved. Spring Security 5.0 解剖速報 2017年11⽉24⽇ Spring Fest 2017@KFC Hall & Rooms 岩塚 卓弥,堅⽥ 淳也 NTT ソフトウェアイノベーションセンタ

Transcript of Spring Security 5.0 解剖速報

Page 1: Spring Security 5.0 解剖速報

Copyright©2017 NTT corp. All Rights Reserved.

Spring Security 5.0 解剖速報

2017年11⽉24⽇Spring Fest 2017@KFC Hall & Rooms

岩塚 卓弥,堅⽥ 淳也NTT ソフトウェアイノベーションセンタ

Page 2: Spring Security 5.0 解剖速報

2Copyright©2017 NTT corp. All Rights Reserved.

• 名前:岩塚 卓弥

• 所属:NTT ソフトウェアイノベーションセンタ• NTTの研究所のうちソフトウェアを専⾨に扱う• ⾃部署ではソフトウェア⼯学を研究• Springベースのグループ共通フレームワークの整備を担当

• Spring関連:• Spring I/O, SpringOne それぞれ2015年から参加• 改訂新版 Spring⼊⾨,Spring徹底⼊⾨ レビュアー• JSUG幹事

Introduction

Page 3: Spring Security 5.0 解剖速報

3Copyright©2017 NTT corp. All Rights Reserved.

• 名前:堅⽥ 淳也

• 所属:NTT ソフトウェアイノベーションセンタ• NTTの研究所のうちソフトウェアを専⾨に扱う• ⾃部署ではソフトウェア⼯学を研究• Springベースのグループ共通フレームワークの整備を担当

• Spring経験• 元SIerで、プロジェクトへのSpring適⽤⽀援などを担当

Introduction

Page 4: Spring Security 5.0 解剖速報

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

Page 5: Spring Security 5.0 解剖速報

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

Page 6: Spring Security 5.0 解剖速報

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

Page 7: Spring Security 5.0 解剖速報

7Copyright©2017 NTT corp. All Rights Reserved.

WebFlux対応Spring Security 5.0 解剖速報

Page 8: Spring Security 5.0 解剖速報

8Copyright©2017 NTT corp. All Rights Reserved.

• Spring Framework 5.0 で追加された仕組み

• リアクティブプログラミングをサポートする新しいWebフレームワーク

• ⾮同期 & ノンブロッキングでリクエストを処理• 少ないスレッドで多くリクエストを処理可能

• → システムリソースの節約• クライアントの数が多い / 低速な場合に特に有効

• IoT• Mobile• Microservices

What is WebFlux?

Page 9: Spring Security 5.0 解剖速報

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 に依存しない

Page 10: Spring Security 5.0 解剖速報

10Copyright©2017 NTT corp. All Rights Reserved.

• ControllerのメソッドからReactive Typeを返却• Mono<T>・・・0個または1個の値を発⾏• Flux<T>・・・0個以上の値を発⾏

Controller (WebFlux)

@RestControllerpublic class UserController {

@AutowiredUserRepository userRepository;

@GetMapping("/listAdult")public Flux<User> listAdult() {

// 20歳以上のユーザを返すreturn userRepository.findAll()

.filter(u -> u.getAge() >= 20);}

}

public interface UserRepository {Flux<User> findAll();

}

/listAdult の結果

Page 11: Spring Security 5.0 解剖速報

11Copyright©2017 NTT corp. All Rights Reserved.

• 従来のSpring SecurityはServlet APIに依存• Servlet Filter• HttpSession• HttpServletRequest• HttpServletResponse・・・

Spring Security WebFlux Support

UsernamePasswordAuthenticationFilter

LogoutFilter

ExceptionTranslationFilter

SessionManagementFilter

Request

・・

・クライアント

Webアプリケーション内のリソース

Servlet Filter群

Response

WebFluxでは使⽤できない

Page 12: Spring Security 5.0 解剖速報

12Copyright©2017 NTT corp. All Rights Reserved.

Form-based Authentication (without WebFlux)

<<interface>>Authentication

Manager

<<interface>>Authentication

Provider

ProviderManager

<<interface>>AuthenticationSuccessHandler

<<Servlet Filter>>UsernamePasswordAuthenticationFilter

HTTPリクエストからユーザ名とパスワードを取り出し、認証処理を開始 認証処理の実装を提供するための

インターフェース

<<interface>>AuthenticationFailureHandler

DaoAuthenticatinProvider

UserDetailsService

認証処理を実⾏するためのインターフェース

データストアからユーザ情報を取り出して認証処理を⾏う実装クラス

データストアからユーザ情報を取り出すサービスインターフェース

認証成功時のハンドリングを⾏うインターフェース

認証失敗時のハンドリングを⾏うインターフェース

AuthenticationManagerの実装クラス

Page 13: Spring Security 5.0 解剖速報

13Copyright©2017 NTT corp. All Rights Reserved.

Form-based Authentication (with WebFlux)

※Spring Security 5 RC1 で確認。正式リリースでは変更されている可能性があります

<<interface>>Reactive

AuthenticationManager

<<WebFilter>>Authentication

WebFilter

<<interface>>Server

AuthenticationSuccessHandler

<<interface>>Server

AuthenticationFailureHandler

<<Function>>ServerFormLoginAuthentication

Converter

UserDetailsRepositoryReactiveAuthentication

Manager

ReactiveUserDetails

Service

Page 14: Spring Security 5.0 解剖速報

14Copyright©2017 NTT corp. All Rights Reserved.

Form-based Authentication (with WebFlux)

※Spring Security 5 RC1 で確認。正式リリースでは変更されている可能性があります

<<interface>>Reactive

AuthenticationManager

<<WebFilter>>Authentication

WebFilter

<<interface>>Server

AuthenticationSuccessHandler

<<interface>>Server

AuthenticationFailureHandler

<<Function>>ServerFormLoginAuthentication

Converter

UserDetailsRepositoryReactiveAuthentication

Manager

ReactiveUserDetails

Service

• AuthenticationWebFilter• 認証を開始するWebFilter

• WebFilter?• Spring Framework 5 で提供されるインターフェース• リアクティブ対応したServlet Filterのようなもの• Spring SecurityでServlet Filterとして実現していたクラス

は基本的にWebFilterに置き換えられている

public interface WebFilter {

Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain);

}

Page 15: Spring Security 5.0 解剖速報

15Copyright©2017 NTT corp. All Rights Reserved.

Form-based Authentication (with WebFlux)

※Spring Security 5 RC1 で確認。正式リリースでは変更されている可能性があります

<<interface>>Reactive

AuthenticationManager

<<WebFilter>>Authentication

WebFilter

<<interface>>Server

AuthenticationSuccessHandler

<<interface>>Server

AuthenticationFailureHandler

<<Function>>ServerFormLoginAuthentication

Converter

UserDetailsRepositoryReactiveAuthentication

Manager

ReactiveUserDetails

Service

• ServerFormLoginAuthenticationConverter• リクエストパラメータから認証情報(usernameとpassword)を抽出するFunction

• 従来からクラスの役割分担が少し変わっている• 従来はFilterの中で認証情報の取得までやっていた• WebFlux対応では認証情報の取得⽅法に応じたAuthenticationConverterをセット

• Basic認証の場合は ServerHttpBasicAuthenticationConverterをフィルタにセットする• フィルタはAuthenticationWebFilterから変えない

Page 16: Spring Security 5.0 解剖速報

16Copyright©2017 NTT corp. All Rights Reserved.

Form-based Authentication (with WebFlux)

※Spring Security 5 RC1 で確認。正式リリースでは変更されている可能性があります

<<interface>>Reactive

AuthenticationManager

<<WebFilter>>Authentication

WebFilter

<<interface>>Server

AuthenticationSuccessHandler

<<interface>>Server

AuthenticationFailureHandler

<<Function>>ServerFormLoginAuthentication

Converter

UserDetailsRepositoryReactiveAuthentication

Manager

ReactiveUserDetails

Service

• ReactiveAuthenticationManager• リアクティブ対応なAuthenticationManager

public interface ReactiveAuthenticationManager {

Mono<Authentication> authenticate(Authentication authentication);

}

Page 17: Spring Security 5.0 解剖速報

17Copyright©2017 NTT corp. All Rights Reserved.

Form-based Authentication (with WebFlux)

※Spring Security 5 RC1 で確認。正式リリースでは変更されている可能性があります

<<interface>>Reactive

AuthenticationManager

<<WebFilter>>Authentication

WebFilter

<<interface>>Server

AuthenticationSuccessHandler

<<interface>>Server

AuthenticationFailureHandler

<<Function>>ServerFormLoginAuthentication

Converter

UserDetailsRepositoryReactiveAuthentication

Manager

ReactiveUserDetails

Service

• UserDetailsRepositoryReactiveAuthenticationManager

• ユーザ情報を取得し、認証処理を実⾏

• 従来からクラスの役割分担が少し変わっている

• 従来はAuthenticationProviderというインターフェースが存在

Page 18: Spring Security 5.0 解剖速報

18Copyright©2017 NTT corp. All Rights Reserved.

Form-based Authentication (with WebFlux)

※Spring Security 5 RC1 で確認。正式リリースでは変更されている可能性があります

<<interface>>Reactive

AuthenticationManager

<<WebFilter>>Authentication

WebFilter

<<interface>>Server

AuthenticationSuccessHandler

<<interface>>Server

AuthenticationFailureHandler

<<Function>>ServerFormLoginAuthentication

Converter

UserDetailsRepositoryReactiveAuthentication

Manager

ReactiveUserDetails

Service

• ReactiveUserDetailsService• リアクティブ対応なUserDetailsService• メソッド名が微妙に変わっている

• 従来はloadUserByUsername

public interface ReactiveUserDetailsService {

Mono<UserDetails> findByUsername(String username);

}

Page 19: Spring Security 5.0 解剖速報

19Copyright©2017 NTT corp. All Rights Reserved.

Form-based Authentication (with WebFlux)

※Spring Security 5 RC1 で確認。正式リリースでは変更されている可能性があります

<<interface>>Reactive

AuthenticationManager

<<WebFilter>>Authentication

WebFilter

<<interface>>Server

AuthenticationSuccessHandler

<<interface>>Server

AuthenticationFailureHandler

<<Function>>ServerFormLoginAuthentication

Converter

UserDetailsRepositoryReactiveAuthentication

Manager

ReactiveUserDetails

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);

}

Page 20: Spring Security 5.0 解剖速報

20Copyright©2017 NTT corp. All Rights Reserved.

• 認可のクラス構成はあまり変わらない

Authorization (with / without WebFlux)

<<interface>>AccessDecision

Manager

<<Servlet Filter>>FilterSecurityInterceptor

<<interface>>Authentication

Entrypoint

<<interface>>AccessDenied

Handler

<<Servlet Filter>>Exception

TranslationFilter

<<interface>>Reactive

AuthorizationManager

<<WebFilter>>Authorization

WebFilter

<<interface>>Server

AuthenticationEntrypoint

<<interface>>Server

AccessDeniedHandler

<<WebFilter>>Exception

TranslationWebFilter

Spring MVC WebFlux

FilterSecurityInterceptor↓AuthorizationWebFilter

AccessDecisionManager↓

ReactiveAuthorizationManager

Page 21: Spring Security 5.0 解剖速報

21Copyright©2017 NTT corp. All Rights Reserved.

• 従来のアーキテクチャと⼤きくは同じ• WebFlux対応のインターフェースには接頭辞としてReactiveとか

Serverが付与されている• AuthenticationManager → ReactiveAuthenticationManager• AuthenticationSuccessHandler → ServerAuthenticationSuccessHandler

• ⼀部、クラスの役割分担が変更されているので注意• ⼀部、インターフェース名が変わっているので対応を⾒つけにくいもの

があるので注意

• 従来のServlet API依存のアーキテクチャがなくなるわけではない• Spring MVC と組み合わせるならこれまで通りのやり⽅でOK

Note

Page 22: Spring Security 5.0 解剖速報

22Copyright©2017 NTT corp. All Rights Reserved.

Reactive Security Configuration@Configuration@EnableWebFluxSecuritypublic class SimpleSecurityConfig {

@Beanpublic 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を登録

Page 23: Spring Security 5.0 解剖速報

23Copyright©2017 NTT corp. All Rights Reserved.

Reactive Security Configuration

@Beanpublic 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()メソッドを呼ぶ

Page 24: Spring Security 5.0 解剖速報

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 に対応

Page 25: Spring Security 5.0 解剖速報

25Copyright©2017 NTT corp. All Rights Reserved.

WebTestClient Support@RunWith(SpringRunner.class)@ContextConfiguration(classes = SpringSecurityDemo.class)public class WebSecurityTest {

@AutowiredApplicationContext context;

WebTestClient client;

@Beforepublic void setUp() {

client = WebTestClient.bindToApplicationContext(context).apply(springSecurity()).configureClient().build();

}

テスト⽤のアノテーションを指定

コンテキストをインジェクション(WebApplicationContextではない)

WebTestClientのセットアップ

Spring Securityのテストサポート機能を適⽤するために、SecurityMockServerConfigurersのstaticメソッドを呼ぶ(MockMvcで使⽤するSecurityMockMvcConfigurersのstaticメソッドはない)

Page 26: Spring Security 5.0 解剖速報

26Copyright©2017 NTT corp. All Rights Reserved.

WebTestClient Support@WithMockUser(roles = "USER")@Testpublic void testPermission01() throws Exception {

client.get().uri("/").exchange().expectStatus().is2xxSuccessful();

}

@Testpublic void testPermission02() throws Exception {

client.get().uri("/").exchange().expectStatus().isFound().expectHeader().valueEquals("Location", "/login");

}

USERロールでログインした状態でテストする

ログインしないとアクセスできないURLへアクセス

ステータスコード200番台でアクセス成功するかチェック

未ログイン状態でテストする(@WithMockUserを付与しない)

ログインページ(/login)へリダイレクトされることをチェック

Page 27: Spring Security 5.0 解剖速報

27Copyright©2017 NTT corp. All Rights Reserved.

WebTestClient Support@WithMockUser(roles = "USER")@Testpublic void testCsrf() throws Exception {

client.mutateWith(csrf()).post().uri("/").exchange().expectStatus().is2xxSuccessful();

CSRF対策を有効化している場合は、SecurityMockServerConfigurersのstaticメソッドを呼び、mutateWithメソッドに渡す

Page 28: Spring Security 5.0 解剖速報

28Copyright©2017 NTT corp. All Rights Reserved.

Reactive Method Security

@Configuration@EnableWebFluxSecurity@EnableReactiveMethodSecuritypublic class SecurityConfig {

JavaConfigクラスに@EnableReactiveMethodSecurityを付与

@Servicepublic class WelcomeServiceImpl implements WelcomeService {

@PreAuthorize("hasRole('ADMIN')")public Mono<String> helloAdmin() {

return Mono.just("Hello Admin!");}

}

リアクティブなメソッドにADMINロールをチェックするアノテーションを追加

Page 29: Spring Security 5.0 解剖速報

29Copyright©2017 NTT corp. All Rights Reserved.

Reactive Method Security (Test)

@RunWith(SpringRunner.class)@ContextConfiguration(classes = SpringSecurityDemo.class)public class WelcomeServiceImplTest {

@AutowiredWelcomeService target;

@WithMockUser(roles = "ADMIN")@Testpublic void testHelloAdmin() {

Mono<String> message = target.helloAdmin();StepVerifier

.create(message)

.expectNext("Hello Admin")

.verifyComplete();}

リアクティブなメソッドのテストにも@WithMockUserを使える

Page 30: Spring Security 5.0 解剖速報

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で実装予定

Page 31: Spring Security 5.0 解剖速報

31Copyright©2017 NTT corp. All Rights Reserved.

• 従来は簡易なログインページが⾃動⽣成される

Default Login Page

Page 32: Spring Security 5.0 解剖速報

32Copyright©2017 NTT corp. All Rights Reserved.

• WebFlux対応だとデフォルトログインページがちょっとリッチになる

Default Login Page (with WebFlux)

Spring Security 5 + Spring MVCSpring Security 5 + Spring WebFlux

LoginPageGeneratingWebFilterがHTMLを⽣成DefaultLoginPageGeneratingFilterがHTMLを⽣成

Bootstrap 4.0.0-beta をインターネット経由で使⽤<title>Please sign in</tit le><link href="https://maxcdn.bootstrapcdn.com/bootstrap /4.0.0-beta /css /bootstrap.min.css"

Page 33: Spring Security 5.0 解剖速報

33Copyright©2017 NTT corp. All Rights Reserved.

• WebFlux対応だとログアウトページも⾃動⽣成される• 従来にはないNew Feature

• ⽣成条件• フォーム認証の設定で、loginPageを指定せずにログインペー

ジを⾃動⽣成させるようにする• GETで/logoutへアクセス

Default Logout Page (with WebFlux)

LogoutPageGeneratingWebFilterがHTMLを⽣成

@Beanpublic SecurityWebFilterChain

springSecurityFilterChain(ServerHttpSecurity http) {

http.authorizeExchange()

.anyExchange().authenticated()

.and().formLogin();

return http.build();}

Page 34: Spring Security 5.0 解剖速報

34Copyright©2017 NTT corp. All Rights Reserved.

OAuth 2.0対応Spring Security 5.0 解剖速報

Page 35: Spring Security 5.0 解剖速報

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の権限を要求

(認可リクエスト)

Page 36: Spring Security 5.0 解剖速報

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のやり取りの説明は割愛

Page 37: Spring Security 5.0 解剖速報

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を使う

Page 38: Spring Security 5.0 解剖速報

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 はメンテナンスモードへ(今後の機能追加なし)

Page 39: Spring Security 5.0 解剖速報

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で「認証機能」提供

Page 40: Spring Security 5.0 解剖速報

40Copyright©2017 NTT corp. All Rights Reserved.

Review : OpenID Connect

End-User

Relying Party(Client)

OpenID Provider(Authorization Server)

UserInfo Endpoint

OAuth 2.0 を認証に使⽤するために拡張したプロトコル

認証リクエスト

Page 41: Spring Security 5.0 解剖速報

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を検証する

Page 42: Spring Security 5.0 解剖速報

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を使う

ユーザプロフィールを渡す

Page 43: Spring Security 5.0 解剖速報

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では両⽅をサポートインタフェースは共通でそれぞれに実装を⽤意

Page 44: Spring Security 5.0 解剖速報

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の情報を

設定しておく

Page 45: Spring Security 5.0 解剖速報

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へリダイレクト

ログイン試⾏

Page 46: Spring Security 5.0 解剖速報

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

認証

Page 47: Spring Security 5.0 解剖速報

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へリダイレクト

認証処理を委譲

Page 48: Spring Security 5.0 解剖速報

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を取得

Page 49: Spring Security 5.0 解剖速報

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を検証

Page 50: Spring Security 5.0 解剖速報

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

リクエスト

ユーザプロフィールを取得

Page 51: Spring Security 5.0 解剖速報

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

ユーザ情報作成

認証済みユーザとしてセッションに格納

Page 52: Spring Security 5.0 解剖速報

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の情報を

設定しておく

Page 53: Spring Security 5.0 解剖速報

53Copyright©2017 NTT corp. All Rights Reserved.

Client / Provider Management

<<interface>>ClientRegistrationRepository

ClientRegistration

ClientRegistration.ProviderDetails

ClientRegistration

ClientRegistration.ProviderDetails

ClientRegistration

ClientRegistration.ProviderDetails

Client情報

各種Endpoint情報

Load

Page 54: Spring Security 5.0 解剖速報

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

Page 55: Spring Security 5.0 解剖速報

55Copyright©2017 NTT corp. All Rights Reserved.

• Authorization Endpoint• Token Endpoint• UserInfo Endpoint• End-UserのIDを取得するための属性名• 公開鍵(JWK Set)取得⽤のEndpoint

ProviderDetails

Page 56: Spring Security 5.0 解剖速報

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へリダイレクト

ログイン試⾏

Page 57: Spring Security 5.0 解剖速報

57Copyright©2017 NTT corp. All Rights Reserved.

Authorization Request (Authentication Request)

OAuth2AuthorizationRequestRedirectFilter

Request

<<interface>>ClientRegistrationRepository

/oauth2/authorization/{registerID} へのリクエストをハンドリング(URLは変更可)

Rediret

Client / Endpoint情報を提供

Authorization Requestを作成

Page 58: Spring Security 5.0 解剖速報

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へリダイレクト

認証処理を委譲

Page 59: Spring Security 5.0 解剖速報

59Copyright©2017 NTT corp. All Rights Reserved.

Review : Authentication with Spring Security

<<interface>>AuthenticationManager

ProviderManager <<interface>>AuthenticationProvider

AuthenticationProviderの実装クラス

AuthenticationProviderの実装クラス

AuthenticationProviderの実装クラス

AuthenticationFilter

Request

リクエストをハンドリング

認証処理を実施

認証処理を委譲

Page 60: Spring Security 5.0 解剖速報

60Copyright©2017 NTT corp. All Rights Reserved.

Authentication with OIDC / OAuth 2.0

<<interface>>AuthenticationManager

ProviderManager <<interface>>AuthenticationProvider

OAuth2LoginAuthenticationFilter

Request/login/oauth2/code/* へのリクエストをハンドリング

(URLは変更可)

OidcAuthorizationCodeAuthenticationProvider

OAuth2LoginAuthenticationProvider

OpenID Connect⽤ OAuth 2.0⽤

Page 61: Spring Security 5.0 解剖速報

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

ユーザ情報作成

認証済みユーザとしてセッションに格納

Page 62: Spring Security 5.0 解剖速報

62Copyright©2017 NTT corp. All Rights Reserved.

OAuth2User

<<interface>>AuthenticatedPrincipal

<<interface>>OAuth2User

DefaultOAuth2User <<interface>>OidcUser

DefaultOidcUser

OAuth 2.0⽤

OpenID Connect⽤UserInfo, ID Token等を持つ

Page 63: Spring Security 5.0 解剖速報

63Copyright©2017 NTT corp. All Rights Reserved.

Save authenticated user information

OAuth2LoginAuthenticationFilter

<<interface>>OAuth2AuthorizedClientService

OAuth2AuthenticationTokenOAuth2AuthorizedClient

OAuth2AccessToken

Save

Save

SecurityContextから取得できるようになる

OAuth2AuthorizedClientService経由で取得できるようになる

<<interface>>OAuth2User

Page 64: Spring Security 5.0 解剖速報

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が作成される

Page 65: Spring Security 5.0 解剖速報

65Copyright©2017 NTT corp. All Rights Reserved.

• ログインページのカスタマイズ• InMemory実装の置換• GrantedAuthorityのカスタマイズ

Customize points

Page 66: Spring Security 5.0 解剖速報

66Copyright©2017 NTT corp. All Rights Reserved.

Customize login page1. WebSecurityConfigurerAdapter を拡張して設定

2. Controllerの実装

3. ログインページの実装

Page 67: Spring Security 5.0 解剖速報

67Copyright©2017 NTT corp. All Rights Reserved.

•ClientRegistrationRepository• デフォルト実装はInMemoryClientRegistrationRepository

• Client情報が固定ならばInMemory実装のままでもあまり困らないかもしれない

•OAuth2AuthorizedClientService• デフォルト実装はInMemoryOAuth2AuthorizedClientService

• 認証済みユーザのAccess Tokenの管理を外部化するためには独⾃で実装が必要となる

Replace InMemory implementation

Page 68: Spring Security 5.0 解剖速報

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 の情報が格納されている

Page 69: Spring Security 5.0 解剖速報

69Copyright©2017 NTT corp. All Rights Reserved.

1. GrantedAuthoritiesMapper の実装を作成

2. WebSecurityConfigurerAdapter を拡張して設定

Customize GrantedAuthority (2/2)

Page 70: Spring Security 5.0 解剖速報

70Copyright©2017 NTT corp. All Rights Reserved.

その他の改善Spring Security 5.0 解剖速報

Page 71: Spring Security 5.0 解剖速報

71Copyright©2017 NTT corp. All Rights Reserved.

• CoreモジュールのPasswordEncoderの削除• 従来からDeprecatedだった• CryptoモジュールのPasswordEncoderを使えば良い

• DelegatingPasswordEncoderの追加• パスワードのハッシュ化のアルゴリズムごとに適切な

PasswordEncoderに処理を委譲する• ハッシュの先頭にアルゴリズムを指定するキーワードの付与が必要

• DaoAuthenticationProviderではデフォルトで使⽤される

Improvement of PasswordEncoder

Page 72: Spring Security 5.0 解剖速報

72Copyright©2017 NTT corp. All Rights Reserved.

DelegatingPasswordEncoder

{algorithm}xxxxxxxxxxxxxxxxxx

ハッシュ値アルゴリズムのID

デフォルトで設定されているアルゴリズムの例

デフォルトではBCryptPasswordEncoderを使⽤してハッシュ化する

アルゴリズムのID PasswordEncoderbcrypt BCryptPasswordEncodersha256 StandardPasswordEncoderMD5 MessageDigestPasswordEncoder(“MD5”)ldap LdapShaPasswordEncoder