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で動く]を見つけることができます。