BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース Spring Security 4.0: WebSocket, Spring Data, テストサポート

Spring Security 4.0: WebSocket, Spring Data, テストサポート

ブックマーク

原文(投稿日:2015/04/21)へのリンク

Spring SecurityチームがSpring Security 4.0.0をリリースした。いくつかの新機能の他,デフォルトでのセキュリティも強化されている。WebSocket Security,Spring Data統合,テストサポートの改善,新たな(Apacheライセンスの)オープンソースプロジェクトとしてSpring Sessionの導入などが主要なテーマだ。Spring Sessionによって,カスタムバックエンドをプロジェクトのHttpSessionプロバイダとして簡単に開発できるようになり,任意の環境からのセッションへのアクセス,クラスタリングのサポートが可能になると同時に,プラグイン可能なセッションIDとWebSocketのサポートも提供される。

WebSocket Security
Spring SecurityがSpringのWebSocketサポートと併用できるようになった。ただしJSR-356(Java API for WebSocket)は,直接的にはサポートしていない。WebSocketチャネルにセキュリティ機能を設定するには,次のようにSpringのJava Configurationを使用すればよい。

@Configuration
public class WebSocketSecurityConfig
        extends AbstractSecurityWebSocketMessageBrokerConfigurer {

    protected void configureInbound(MessageSecurityMetadataSourceRegistry messages) {
        messages.simpDestMatchers("/user/*").authenticated();
    }
}

Spring Dataインテグレーション
SpELを使ったSpring Dataクエリからの,カレントユーザのアクセスが可能になった。この機能をJava Configurationで有効にするには,@Beanを定義すればよい。

@Bean
public SecurityEvaluationContextExtension securityEvaluationContextExtension(){
    return new SecurityEvaluationContextExtension();
}

これにより,クエリ内でSpring Securityのprincipalを参照できるようになる。例えば

public interface BlogRepository extends JpaRepository<Blog,Long> {
    @Query("select blog from Blog blog where blog.user.login = ?#{principal.username}")
    List<Blog> findAllForCurrentUser();
}

テストサポートの改善
Spring Security 4.0では,証明を要するテストメソッドを簡略化するために,多数のアノテーションが追加されている。例えば@PreAuthorize("authenticated")をメソッドに指定することで,次のようなメカニズムを使ったテストが可能になる。

  • @WithMockUser: @Testメソッドが,ユーザ名“user,”パスワード“password”,ロール“ROLE_USER”というユーザで実行するテストに追加する。各パラメータは,アノテーションでパラメータを指定することによってオーバーライドすることができる: @WithMockUser(username="admin",roles={"USER","ADMIN"})
  • @WithUserDetails: @WithMockUserに似ているが,Authenticationプリンシパルをカスタマイズして,Spring Securityとの結合性を低減することができる。
  • @WithSecurityContext: 最大限の柔軟性を提供する。独自のテストアノテーションを定義可能。

Spring Security 4.0は,Spring MVC Test (4.1.3+)と併用することも可能だ。以下の例ではSecurityMockMvcConfigurers.springSecurity()が,2つのフレームワークを統合するためのすべてのセットアップを実行する。

import static org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers.*;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
@WebAppConfiguration
public class CsrfShowcaseTests {

    @Autowired
    private WebApplicationContext context;

    private MockMvc mvc;

    @Before
    public void setup() {
        mvc = MockMvcBuilders
                .webAppContextSetup(context)
                .apply(springSecurity())
                .build();
    }
…
}

Spring Security 3.xから4.xへのマイグレーション
Spring Securityチームは,Spring Security 3.xから4.xへの移行ガイドを公開している。このガイドにはXMLコンフィギュレーションやJavaコンフィギュレーションの説明の他,サンプルマイグレーションに必要な変更点に注目した差分リストを紹介されている。

Spring Security 4.0 Java Configuration
最も基本的なSpring Security JavaコンフィギュレーションはServlet Filterを生成して,すべてのセキュリティ(URLのプロテクト,資格証明の検証,ログインのリダイレクト等)を担当する方法である。数行のコードが必要だが,その半分はクラスのインポートだ。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.*;
import org.springframework.security.config.annotation.authentication.builders.*;
import org.springframework.security.config.annotation.web.configuration.*;

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
            .withUser("user").password("password").roles("USER");
    }
}

コード量は少ないが,提供する機能は多い。

  • アプリケーションのすべてのURLに認証を必要にする
  • あなた用のログインフォームを生成する
  • フォームベース認証でuser:passwordを認証可能にする
  • ユーザのログアウトを可能にする
  • CSRF攻撃防止
  • セッション固定プロテクション
  • セキュリティヘッダ統合
    • HTTP Strict Transport Securityによるセキュアなリクエスト
    • X-Content-Type-Option統合
    • キャッシュ制御
    • X-XSS-Protection統合
    • X-Frame-Option統合によるクリックジャック防止
  • HttpServletRequest APIメソッドとの統合: getRemoteUser(), getUserPrinciple(), isUserInRole(role), login(ユーザ名, パスワード), logout()

このリリースをSpring Boot 1.2プロジェクトで使用するには,次のようのSring Securityのバージョンをオーバーライドすればよい。

<properties>
    <spring-security.version>4.0.0.RELEASE</spring-security.version>
</properties>

Spring Security 4.0に関する詳細は,開発リーダのRob Winch氏によるInfoQのプレゼンテーション“From 0 to Spring Security 4.0”を参照してほしい。このプレゼンテーションのスライドは,SlideShareで公開されている

この記事に星をつける

おすすめ度
スタイル

BT