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)
@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 の結果
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では
使⽤できない
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の
実装クラス
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
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);
}
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から変えない
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);
}
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というイン
ターフェースが存在
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);
}
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);
}
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
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
@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を登録
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()メソッドを呼ぶ
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 {
@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メソッドはない)
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)へリダイレクト
されることをチェック
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メソッドに渡す
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
ロールをチェックするアノテーション
を追加
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を使える
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 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"
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();
}
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)
OAuth2Authorization
RequestRedirectFilter
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
OAuth2Login
AuthenticationFilter
Request
/login/oauth2/code/* への
リクエストをハンドリング
(URLは変更可)
OidcAuthorizationCode
AuthenticationProvider
OAuth2Login
AuthenticationProvider
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
OAuth2Login
AuthenticationFilter
<<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 page
1. 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 PasswordEncoder
bcrypt BCryptPasswordEncoder
sha256 StandardPasswordEncoder
MD5 MessageDigestPasswordEncoder(“MD5”)
ldap LdapShaPasswordEncoder

Spring Security 5.0 解剖速報

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