Spring SecurityとSpringデータ

Spring SecurityによるSpringデータ

1. 概要

Spring Securityは、Spring Dataとの統合を適切にサポートします。 前者はアプリケーションのセキュリティ面を処理しますが、後者はアプリケーションのデータを含むデータベースへの便利なアクセスを提供します。

この記事では、Spring Security can be integrated with Spring Data to enable more user-specific queriesの方法について説明します。

2. Spring Security + Springデータ構成

introduction to Spring Data JPAで、SpringプロジェクトでSpringデータを設定する方法を確認しました。 春のセキュリティと春のデータを有効にするために、通常どおり、JavaまたはXMLベースの構成を採用できます。

2.1. Java設定

Spring Security Login Form(セク​​ション4および5)から、アノテーションベースの構成を使用してプロジェクトにSpringSecurityを追加できることを思い出してください。

@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    // Bean definitions
}

その他の構成の詳細には、フィルター、Bean、および必要に応じて他のセキュリティルールの定義が含まれます。

SpringSecurityでSpringDataを有効にするには、次のBeanをWebSecurityConfigに追加するだけです。

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

上記の定義により、クラスに注釈が付けられたスプリングデータ固有の式の自動解決のアクティブ化が可能になります。

2.2. XML構成

XMLベースの構成は、Spring Security名前空間を含めることから始まります。


...

Javaベースの構成と同様に、XMLまたは名前空間ベースの構成の場合、SecurityEvaluationContextExtensionBeanをXML構成ファイルに追加します。

SecurityEvaluationContextExtensionを定義すると、SpringSecurityのすべての一般的な式をSpringDataクエリ内から使用できるようになります。

このような一般的な式には、principal, authentication, isAnonymous(), hasRole([role]), isAuthenticated,などが含まれます。

3. 使用例

SpringDataとSpringSecurityのいくつかのユースケースを考えてみましょう。

3.1. AppUserのフィールド更新を制限する

この例では、AppUserlastLoginフィールドの更新を現在認証されている唯一のユーザーに制限する方法を見ていきます。

これは、updateLastLoginメソッドがトリガーされるたびに、現在認証されているユーザーのlastLoginフィールドのみを更新することを意味します。

これを実現するために、以下のクエリをUserRepositoryインターフェイスに追加します。

@Query("UPDATE AppUser u SET u.lastLogin=:lastLogin WHERE"
  +" u.username = ?#{ principal?.username }")
public void updateLastLogin (Date lastLogin);

SpringDataとSpringSecurityの統合がなければ、通常、ユーザー名を引数としてupdateLastLoginに渡す必要があります。

間違ったユーザー資格情報が提供された場合、ログインプロセスは失敗し、アクセスの検証を保証する必要はありません。

3.2. ページネーションを使用して特定のAppUser'コンテンツをフェッチする

Spring DataとSpring Securityが完全に連携して動作する別のシナリオは、現在認証されているユーザーが所有するデータベースからコンテンツを取得する必要がある場合です。

たとえば、ツィーターアプリケーションがある場合、パーソナライズされたフィードページに現在のユーザーが作成または気に入ったツイートを表示できます。

もちろん、これには、データベース内の1つ以上のテーブルと対話するためのクエリの作成が含まれる場合があります。 Spring DataとSpring Securityでは、これは書くのと同じくらい簡単です:

public interface TweetRepository extends PagingAndSortingRepository {
    @Query("select twt from Tweet twt  JOIN twt.likes as lk where lk ="+
      " ?#{ principal?.username } or twt.owner = ?#{ principal?.username }")
    Page getMyTweetsAndTheOnesILiked(Pageable pageable);
}

結果をページ分割する必要があるため、上記のインターフェイス定義では、TweetRepositoryPagingAndSortingRepositoryを拡張します。

4. 結論

Spring DataとSpring Securityの統合により、Springアプリケーションの認証状態を管理するための柔軟性が大幅に向上します。

このセッションでは、SpringデータにSpringSecurityを追加する方法について説明しました。 SpringDataまたはSpringSecurityの他の強力な機能の詳細については、Spring DataおよびSpring Securityの記事のコレクションを参照してください。

いつものように、コードスニペットはover on GitHubにあります。