Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Copyright ©2016 NS Solutions Corporation. All Rights Reserved.
Spring Security 4.1 の新機能
2016/09/03
新日鉄住金ソリューションズ株式会社
井岡 正和...
Copyright ©2016 NS Solutions Corporation. All Rights Reserved.
自己紹介
 井岡 正和 (いおか まさかず)
 Spring ベースの社内標準FW開発・保守担当
 Spring...
Copyright ©2016 NS Solutions Corporation. All Rights Reserved.
今日紹介する内容
 Spring Security 4.1 の新機能について
 CookieCsrfTokenRe...
Copyright ©2016 NS Solutions Corporation. All Rights Reserved.
(おさらい) Spring Security の基本的な使い方
@EnableWebSecurity
public c...
Copyright ©2016 NS Solutions Corporation. All Rights Reserved.
Spring Security 4.1 の
新機能について
5
Copyright ©2016 NS Solutions Corporation. All Rights Reserved.
CookieCsrfTokenRepository
6
 CSRF トークンを Cookie に格納できるようになっ...
Copyright ©2016 NS Solutions Corporation. All Rights Reserved.
Content Security Policy
7
 Content Security Policy の設定ができる...
Copyright ©2016 NS Solutions Corporation. All Rights Reserved.
@AuthenticationPrincipal (1/2)
8
 認証ユーザを Controller の引数で取得...
Copyright ©2016 NS Solutions Corporation. All Rights Reserved.
@AuthenticationPrincipal (2/2)
9
 ただし、@AuthenticationPrinc...
Copyright ©2016 NS Solutions Corporation. All Rights Reserved.
Path Variables in Web Security Expressions
10
 Web Securit...
Copyright ©2016 NS Solutions Corporation. All Rights Reserved.
Referring to Beans in Web Security Expressions
11
 Web Sec...
Copyright ©2016 NS Solutions Corporation. All Rights Reserved.
MvcRequestMatcher
12
 「/admin」のアクセス制限をした場合に、
「/admin/」からもア...
Copyright ©2016 NS Solutions Corporation. All Rights Reserved.
おわりに
13
 とても簡単にセキュリティ設定ができるので、
強固なアプリケーションを作ってください!
 他にもい...
Copyright ©2016 NS Solutions Corporation. All Rights Reserved. 14
NS Solutions、NS(ロゴ)、NSSOLは、新日鉄住金ソリューションズ株式会社の登録商標です。
Jav...
Upcoming SlideShare
Loading in …5
×

Spring Security 4.1 の新機能

1,258 views

Published on

日本Springユーザ会SpringOne Platform 2016報告会で、Spring Security 4.1の新機能の紹介

Published in: Technology
  • Be the first to comment

Spring Security 4.1 の新機能

  1. 1. Copyright ©2016 NS Solutions Corporation. All Rights Reserved. Spring Security 4.1 の新機能 2016/09/03 新日鉄住金ソリューションズ株式会社 井岡 正和 日本Springユーザ会 SpringOne Platform 2016 報告会
  2. 2. Copyright ©2016 NS Solutions Corporation. All Rights Reserved. 自己紹介  井岡 正和 (いおか まさかず)  Spring ベースの社内標準FW開発・保守担当  SpringOne の参加は3回目  プライベートでは、iOS・Android のアプリを開発 http://www.slideshare.net/KoUmetani/spring2015-56309694 去年もSpring Security 関連について 紹介させていただきました。 2
  3. 3. Copyright ©2016 NS Solutions Corporation. All Rights Reserved. 今日紹介する内容  Spring Security 4.1 の新機能について  CookieCsrfTokenRepository  Content Security Policy  @AuthenticationPrincipal  Path Variables in Web Security Expressions  Referring to Beans in Web Security Expressions  MvcRequestMatcher 3 参考セッション: To Spring Security 4.1 and Beyond セッションで使用されたコード: https://github.com/rwinch/spring-security-4.1-and-beyond
  4. 4. Copyright ©2016 NS Solutions Corporation. All Rights Reserved. (おさらい) Spring Security の基本的な使い方 @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { // @formatter:off @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/", "/assets/**", "/webjars/**").permitAll() .anyRequest().authenticated() .and() .httpBasic(); } // @formatter:on WebSecurityConfigurerAdapter を継承 @EnableWebSecurity を追加 configure をオーバーライド リソースへのアクセス許可 Basic認証を有効 その他のアクセスに認証 自分で指定したインデントがIDEのフォーマッタで崩れてしまうが、 「// @formatter:off」と「// @formatter:on」で囲うことで、 その中のコードはフォーマッターがかからなくなる。 4
  5. 5. Copyright ©2016 NS Solutions Corporation. All Rights Reserved. Spring Security 4.1 の 新機能について 5
  6. 6. Copyright ©2016 NS Solutions Corporation. All Rights Reserved. CookieCsrfTokenRepository 6  CSRF トークンを Cookie に格納できるようになった  デフォルトでは「XSRF-TOKEN」に格納される AngularJS では、Cookie に XSRF-TOKEN があると、 自動的に X-XSRF-TOKEN ヘッダを付けてくれるらしい @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/", "/assets/**", "/webjars/**").permitAll() .anyRequest().authenticated() .and() .httpBasic() .and() .csrf() .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()); } CSRF の CsrfTokenRepository に、 CookieCsrfTokenRepository を指定 JavaScript 等から読み込む場合は、 withHttpOnlyFalse() によって CsrfTokenRepository を取得する。
  7. 7. Copyright ©2016 NS Solutions Corporation. All Rights Reserved. Content Security Policy 7  Content Security Policy の設定ができるようになった  XSS やデータインジェクション等の攻撃を対策できる @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/", "/assets/**", "/webjars/**").permitAll() .anyRequest().authenticated() .and() .httpBasic() .and() .headers() .contentSecurityPolicy("default-src 'self' " + "https://ajax.googleapis.com; " + "style-src 'self' 'unsafe-inline'"); } ヘッダに Content Security Policy を設定 contentSecurityPolicy() の後ろに「.reportOnly()」 を追加すると、ポリシー違反の通知のみになる。 ここでの設定では、 自身のドメインと「https://ajax.googleapis.com」を許可 スタイルについては自身のドメインとインラインの<style>要素のみ許可
  8. 8. Copyright ©2016 NS Solutions Corporation. All Rights Reserved. @AuthenticationPrincipal (1/2) 8  認証ユーザを Controller の引数で取得できるようになった @RestController public class SecurityController { @RequestMapping(value = "/principal") public ResponseEntity<User> currentPrincipal(@AuthenticationPrincipal User user) { return new ResponseEntity<User>(user, HttpStatus.OK); } これだけ!  以前は、下記のようにして取得していた @RequestMapping(value = "/principal") public ResponseEntity<User> currentPrincipal() { User user = (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal(); @RequestMapping(value = "/principal") public ResponseEntity<User> currentPrincipal(Authentication authentication) { User user = (User) authentication.getPrincipal(); 大変!
  9. 9. Copyright ©2016 NS Solutions Corporation. All Rights Reserved. @AuthenticationPrincipal (2/2) 9  ただし、@AuthenticationPrincipal は直接使用せず、 @CurrentUser のように意味が伝わるアノテーションを 作成して使用したほうが保守性が上がる @RestController public class SecurityController { @RequestMapping(value = "/principal") public ResponseEntity<User> currentPrincipal(@CurrentUser User user) { return new ResponseEntity<User>(user, HttpStatus.OK); } @Target(ElementType.PARAMETER) @Retention(RetentionPolicy.RUNTIME) @Documented @AuthenticationPrincipal public @interface CurrentUser { }
  10. 10. Copyright ©2016 NS Solutions Corporation. All Rights Reserved. Path Variables in Web Security Expressions 10  Web Security Expressions で Path Variable を 使用できるようになった @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/", "/assets/**", "/webjars/**").permitAll() .antMatchers("/users/{userId}").access("#userId == principal.id.toString()") .anyRequest().authenticated() .and() .httpBasic(); } @RequestMapping と同じで 中括弧で変数を指定 「#変数名」で使用できる
  11. 11. Copyright ©2016 NS Solutions Corporation. All Rights Reserved. Referring to Beans in Web Security Expressions 11  Web Security Expressions で Bean を 使用できるようになった @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/", "/assets/**", "/webjars/**").permitAll() .antMatchers("/users/{userId}").access("@authz.check(#userId,principal)") .anyRequest().authenticated() .and() .httpBasic(); } 「@Bean名」で使用できる @Component public class Authz { public boolean check(Long userId, User user) { return userId.equals(user.getId()); } } 「authz」というBean名で登録される @PreAuthorize や@PostAuthorize 等でも Bean を使用できる
  12. 12. Copyright ©2016 NS Solutions Corporation. All Rights Reserved. MvcRequestMatcher 12  「/admin」のアクセス制限をした場合に、 「/admin/」からもアクセス制限できるようになった @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/", "/assets/**", "/webjars/**").permitAll() .mvcMatchers("/admin").denyAll() .anyRequest().authenticated() .and() .httpBasic(); } antMatchers ではなく、 mvcMatchers を使用する @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/", "/assets/**", "/webjars/**").permitAll() .antMatchers("/admin").denyAll() .anyRequest().authenticated() .and() .httpBasic(); } 下記のように antMatchers("/admin").denyAll() とした場合は、 「/admin/」でアクセスできる
  13. 13. Copyright ©2016 NS Solutions Corporation. All Rights Reserved. おわりに 13  とても簡単にセキュリティ設定ができるので、 強固なアプリケーションを作ってください!  他にもいろいろな機能が 4.1 で追加されています  http://docs.spring.io/spring- security/site/docs/current/reference/htmlsingle/#new
  14. 14. Copyright ©2016 NS Solutions Corporation. All Rights Reserved. 14 NS Solutions、NS(ロゴ)、NSSOLは、新日鉄住金ソリューションズ株式会社の登録商標です。 Javaは、米国ORACLE Corp.の登録商標です。 その他本文記載の会社名及び製品名は、それぞれ各社の商標又は登録商標です。

×