衝突
複数のリポジトリの問題は、どのユーザーがどのユーザーであるかを確実に区別する必要があることです。たとえば、データが次のようになっていると仮定します
メンバーテーブル
username
----------------------
member
モデレーターテーブル
username
----------------------
moderator
次に、ユーザーに関連付けられたデータがあります
データ表
username value
----------------------------------------
moderator secret
衝突した場合はどうなりますか?たとえば、ユーザーがサインアップすると、メンバーテーブルは次のようになります。
メンバーテーブル
username
----------------------
member
moderator
どのモデレーターがデータを所有していますか?2人のユーザーを区別する方法はありません。
代替アプローチ
別のアプローチは、ユーザーからロールへのマッピングを使用することです。次のようなものを使用することになります。
メンバーテーブル
username is_moderator
----------------------
member false
moderator true
次に、ユーザーが既存のユーザー名でサインアップしようとすると、制約違反が発生するため、2つを区別する必要はありません。もちろん、別のテーブルを使用してロールをマップすることもできます。これは、SpringSecurityがauthoritiesテーブルを使用して通常行うことです。
複数のUserDetailsServiceを使用する
とにかく複数のユーザーリポジトリを本当に使用したい場合は、構成で複数のUserDetailsServiceエントリを宣言するだけです。インメモリ構成の例を以下に示します。
<authentication-manager>
<authentication-provider>
<jdbc-user-service .. />
</authentication-provider>
<authentication-provider>
<user-service>
<user username="moderator"
password="password"
authorities="ROLE_MODERATOR"/>
</user-service>
</authentication-provider>
</authentication-manager>
データベースで両方を実行する場合は、各テーブルのSQLクエリを判別してから、2つの要素を追加する必要があります。例えば:
<authentication-manager>
<authentication-provider>
<jdbc-user-service .. />
</authentication-provider>
<authentication-provider>
<jdbc-user-service .. />
</authentication-provider>
</authentication-manager>
属性を使用してSQLクエリを制御します。クエリの例については、SpringSecurityの付録を参照してください。