spring security 5.0 解剖速報
TRANSCRIPT
Copyright©2017 NTT corp. All Rights Reserved.
Spring Security 5.0 解剖速報
2017年11⽉24⽇Spring Fest 2017@KFC Hall & Rooms
岩塚 卓弥,堅⽥ 淳也NTT ソフトウェアイノベーションセンタ
2Copyright©2017 NTT corp. All Rights Reserved.
• 名前:岩塚 卓弥
• 所属:NTT ソフトウェアイノベーションセンタ• NTTの研究所のうちソフトウェアを専⾨に扱う• ⾃部署ではソフトウェア⼯学を研究• Springベースのグループ共通フレームワークの整備を担当
• Spring関連:• Spring I/O, SpringOne それぞれ2015年から参加• 改訂新版 Spring⼊⾨,Spring徹底⼊⾨ レビュアー• JSUG幹事
Introduction
3Copyright©2017 NTT corp. All Rights Reserved.
• 名前:堅⽥ 淳也
• 所属:NTT ソフトウェアイノベーションセンタ• NTTの研究所のうちソフトウェアを専⾨に扱う• ⾃部署ではソフトウェア⼯学を研究• Springベースのグループ共通フレームワークの整備を担当
• Spring経験• 元SIerで、プロジェクトへのSpring適⽤⽀援などを担当
Introduction
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
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
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
7Copyright©2017 NTT corp. All Rights Reserved.
WebFlux対応Spring Security 5.0 解剖速報
8Copyright©2017 NTT corp. All Rights Reserved.
• Spring Framework 5.0 で追加された仕組み
• リアクティブプログラミングをサポートする新しいWebフレームワーク
• ⾮同期 & ノンブロッキングでリクエストを処理• 少ないスレッドで多くリクエストを処理可能
• → システムリソースの節約• クライアントの数が多い / 低速な場合に特に有効
• IoT• Mobile• Microservices
What is WebFlux?
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 に依存しない
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 の結果
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では使⽤できない
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の実装クラス
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
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);
}
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から変えない
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);
}
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というインターフェースが存在
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);
}
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);
}
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
21Copyright©2017 NTT corp. All Rights Reserved.
• 従来のアーキテクチャと⼤きくは同じ• WebFlux対応のインターフェースには接頭辞としてReactiveとか
Serverが付与されている• AuthenticationManager → ReactiveAuthenticationManager• AuthenticationSuccessHandler → ServerAuthenticationSuccessHandler
• ⼀部、クラスの役割分担が変更されているので注意• ⼀部、インターフェース名が変わっているので対応を⾒つけにくいもの
があるので注意
• 従来のServlet API依存のアーキテクチャがなくなるわけではない• Spring MVC と組み合わせるならこれまで通りのやり⽅でOK
Note
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を登録
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()メソッドを呼ぶ
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 に対応
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メソッドはない)
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)へリダイレクトされることをチェック
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メソッドに渡す
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ロールをチェックするアノテーションを追加
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を使える
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で実装予定
31Copyright©2017 NTT corp. All Rights Reserved.
• 従来は簡易なログインページが⾃動⽣成される
Default Login Page
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"
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();}
34Copyright©2017 NTT corp. All Rights Reserved.
OAuth 2.0対応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の権限を要求
(認可リクエスト)
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のやり取りの説明は割愛
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を使う
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 はメンテナンスモードへ(今後の機能追加なし)
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で「認証機能」提供
40Copyright©2017 NTT corp. All Rights Reserved.
Review : OpenID Connect
End-User
Relying Party(Client)
OpenID Provider(Authorization Server)
UserInfo Endpoint
OAuth 2.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を検証する
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を使う
ユーザプロフィールを渡す
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では両⽅をサポートインタフェースは共通でそれぞれに実装を⽤意
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の情報を
設定しておく
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へリダイレクト
ログイン試⾏
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
認証
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へリダイレクト
認証処理を委譲
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を取得
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を検証
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
リクエスト
ユーザプロフィールを取得
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
ユーザ情報作成
認証済みユーザとしてセッションに格納
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の情報を
設定しておく
53Copyright©2017 NTT corp. All Rights Reserved.
Client / Provider Management
<<interface>>ClientRegistrationRepository
ClientRegistration
ClientRegistration.ProviderDetails
ClientRegistration
ClientRegistration.ProviderDetails
ClientRegistration
ClientRegistration.ProviderDetails
Client情報
各種Endpoint情報
Load
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
55Copyright©2017 NTT corp. All Rights Reserved.
• Authorization Endpoint• Token Endpoint• UserInfo Endpoint• End-UserのIDを取得するための属性名• 公開鍵(JWK Set)取得⽤のEndpoint
ProviderDetails
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へリダイレクト
ログイン試⾏
57Copyright©2017 NTT corp. All Rights Reserved.
Authorization Request (Authentication Request)
OAuth2AuthorizationRequestRedirectFilter
Request
<<interface>>ClientRegistrationRepository
/oauth2/authorization/{registerID} へのリクエストをハンドリング(URLは変更可)
Rediret
Client / Endpoint情報を提供
Authorization Requestを作成
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へリダイレクト
認証処理を委譲
59Copyright©2017 NTT corp. All Rights Reserved.
Review : Authentication with Spring Security
<<interface>>AuthenticationManager
ProviderManager <<interface>>AuthenticationProvider
AuthenticationProviderの実装クラス
AuthenticationProviderの実装クラス
AuthenticationProviderの実装クラス
AuthenticationFilter
Request
リクエストをハンドリング
認証処理を実施
認証処理を委譲
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⽤
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
ユーザ情報作成
認証済みユーザとしてセッションに格納
62Copyright©2017 NTT corp. All Rights Reserved.
OAuth2User
<<interface>>AuthenticatedPrincipal
<<interface>>OAuth2User
DefaultOAuth2User <<interface>>OidcUser
DefaultOidcUser
OAuth 2.0⽤
OpenID Connect⽤UserInfo, ID Token等を持つ
63Copyright©2017 NTT corp. All Rights Reserved.
Save authenticated user information
OAuth2LoginAuthenticationFilter
<<interface>>OAuth2AuthorizedClientService
OAuth2AuthenticationTokenOAuth2AuthorizedClient
OAuth2AccessToken
Save
Save
SecurityContextから取得できるようになる
OAuth2AuthorizedClientService経由で取得できるようになる
<<interface>>OAuth2User
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が作成される
65Copyright©2017 NTT corp. All Rights Reserved.
• ログインページのカスタマイズ• InMemory実装の置換• GrantedAuthorityのカスタマイズ
Customize points
66Copyright©2017 NTT corp. All Rights Reserved.
Customize login page1. WebSecurityConfigurerAdapter を拡張して設定
2. Controllerの実装
3. ログインページの実装
67Copyright©2017 NTT corp. All Rights Reserved.
•ClientRegistrationRepository• デフォルト実装はInMemoryClientRegistrationRepository
• Client情報が固定ならばInMemory実装のままでもあまり困らないかもしれない
•OAuth2AuthorizedClientService• デフォルト実装はInMemoryOAuth2AuthorizedClientService
• 認証済みユーザのAccess Tokenの管理を外部化するためには独⾃で実装が必要となる
Replace InMemory implementation
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 の情報が格納されている
69Copyright©2017 NTT corp. All Rights Reserved.
1. GrantedAuthoritiesMapper の実装を作成
2. WebSecurityConfigurerAdapter を拡張して設定
Customize GrantedAuthority (2/2)
70Copyright©2017 NTT corp. All Rights Reserved.
その他の改善Spring Security 5.0 解剖速報
71Copyright©2017 NTT corp. All Rights Reserved.
• CoreモジュールのPasswordEncoderの削除• 従来からDeprecatedだった• CryptoモジュールのPasswordEncoderを使えば良い
• DelegatingPasswordEncoderの追加• パスワードのハッシュ化のアルゴリズムごとに適切な
PasswordEncoderに処理を委譲する• ハッシュの先頭にアルゴリズムを指定するキーワードの付与が必要
• DaoAuthenticationProviderではデフォルトで使⽤される
Improvement of PasswordEncoder
72Copyright©2017 NTT corp. All Rights Reserved.
DelegatingPasswordEncoder
{algorithm}xxxxxxxxxxxxxxxxxx
ハッシュ値アルゴリズムのID
デフォルトで設定されているアルゴリズムの例
デフォルトではBCryptPasswordEncoderを使⽤してハッシュ化する
アルゴリズムのID PasswordEncoderbcrypt BCryptPasswordEncodersha256 StandardPasswordEncoderMD5 MessageDigestPasswordEncoder(“MD5”)ldap LdapShaPasswordEncoder