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コンフィギュレーションの説明の他,サンプルマイグレーションに必要な変更点に注目した差分リストを紹介されている。
- XMLを使用した場合のSpring Security 3.xから4.xへのマイグレーション
- Java Configurationを使用した場合のSpring Security 3.xから4.xへのマイグレーション
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で公開されている。