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のフィールド更新を制限する
この例では、AppUserのlastLoginフィールドの更新を現在認証されている唯一のユーザーに制限する方法を見ていきます。
これは、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);
}
結果をページ分割する必要があるため、上記のインターフェイス定義では、TweetRepositoryがPagingAndSortingRepositoryを拡張します。
4. 結論
Spring DataとSpring Securityの統合により、Springアプリケーションの認証状態を管理するための柔軟性が大幅に向上します。
このセッションでは、SpringデータにSpringSecurityを追加する方法について説明しました。 SpringDataまたはSpringSecurityの他の強力な機能の詳細については、Spring DataおよびSpring Securityの記事のコレクションを参照してください。
いつものように、コードスニペットはover on GitHubにあります。