Spring SecurityとSpringデータ
データ]** リンク:/category/春/春のセキュリティ/[春のセキュリティ]
1概要
Spring Securityは、Spring Dataとの統合をうまくサポートしています。前者はアプリケーションのセキュリティ面を扱いますが、後者はアプリケーションのデータを含むデータベースへの便利なアクセスを提供します。
この記事では、Spring SecurityをSpring Dataと統合して、よりユーザー固有のクエリを可能にする方法について説明します。
2 Spring SecurityのSpringデータ設定
私たちのリンクでは、/Springデータを含む永続層[Spring Data JPAの紹介]で、SpringプロジェクトでSpring Dataを設定する方法を見ました。
通常どおりSpring SecurityおよびSpring Dataを有効にするために、JavaまたはXMLベースの設定を採用できます。
2.1. Javaの設定
/spring-security-login[Spring Securityログインフォーム](セクション4)からそれを思い出してください。
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
//Bean definitions
}
その他の設定の詳細には、必要に応じてフィルタ、Bean、およびその他のセキュリティルールの定義が含まれます。
-
Spring SecurityでSpring Dataを有効にするには、このBeanを
WebSecurityConfig
に追加するだけです。
@Bean
public SecurityEvaluationContextExtension securityEvaluationContextExtension() {
return new SecurityEvaluationContextExtension();
}
上記の定義により、クラスに注釈が付けられたスプリングデータ固有の式の自動解決を有効にすることができます。
2.2. XML設定
XMLベースの設定は、Spring Security名前空間を含めることから始まります。
<beans:beans xmlns="http://www.springframework.org/schema/security"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security.xsd">
...
</beans:beans>
Javaベースの設定と同じように、XMLまたはネームスペースベースの設定では、XML設定ファイルに
SecurityEvaluationContextExtension
Beanを追加します。
<bean class="org.springframework.security.data.repository
.query.SecurityEvaluationContextExtension"/>
SecurityEvaluationContextExtension
を定義すると、Spring Securityのすべての一般式をSpring Dataクエリ内から使用できるようになります。
このような一般的な表現には、__principal、authentication、isAnonymous()、hasRole([role])、isAuthenticatedなどがあります。
** 3使用例
Spring DataとSpring Securityのユースケースをいくつか考えてみましょう。
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);
Spring DataとSpring Securityが統合されていない場合、通常は
updateLastLogin
の引数としてユーザー名を渡す必要があります。
間違ったユーザー認証情報が提供された場合、ログインプロセスは失敗し、アクセスの検証を確実にすることを気にする必要はありません。
3.2. ページ付けを使用して特定の
AppUser’
コンテンツを取得
Spring DataとSpring Securityが完全に連携して動作するもう1つのシナリオは、現在認証されているユーザーが所有しているデータベースからコンテンツを取得する必要がある場合です。
たとえば、ツイーターアプリケーションを使用している場合は、現在のユーザーが作成した、または気に入ったツイートを自分のパーソナライズされたフィードページに表示することができます。
もちろん、これは私達のデータベース内の一つ以上のテーブルと対話するためのクエリを書くことを含むかもしれません。 Spring DataとSpring Securityでは、これは書くのと同じくらい簡単です。
public interface TweetRepository extends PagingAndSortingRepository<Tweet, Long> {
@Query("select twt from Tweet twt JOIN twt.likes as lk where lk ="+
" ?#{ principal?.username } or twt.owner = ?#{ principal?.username }")
Page<Tweet> getMyTweetsAndTheOnesILiked(Pageable pageable);
}
結果にページ番号を付けたいので、
TweetRepository
は上記のインターフェース定義の
PagingAndSortingRepository
を拡張します。
4結論
Spring DataとSpring Securityの統合により、Springアプリケーションで認証された状態を柔軟に管理できます。
このセッションでは、Spring DataにSpring Securityを追加する方法について説明しました。 Spring DataまたはSpring Securityのその他の強力な機能についての詳細は、
Spring Data
および
Spring Security
の記事のコレクションにあります。
いつものように、コードスニペットはhttps://github.com/eugenp/tutorials/tree/master/spring-security-mvc-boot[GitHubで動く]を見つけることができます。