0

私はSpringセキュリティに非常に慣れていません。私の問題は次のとおりです。

ユーザー名、パスワード、役割など、Web サイトのメンバーに関する情報を含むメンバー mysql テーブルがありますこれまでのところ、このテーブルを使用して<jdbc-user-service.

ただし、メンバーテーブルに含まれないスーパーユーザーも必要です。

  1. このスーパーユーザーをメモリ内ユーザー リポジトリに配置して、jdbc ユーザー サービスとメモリ内ユーザー サービスを混在させることは可能であり、推奨されますか? もしそうなら、どのように?
  2. 1.が不可能な場合は、おそらくインスタンスmoderatorと呼ばれる 2 番目の mysql テーブルを作成できます。では、これら 2 つのテーブルに対して認証を行うには、どのような SQL クエリが必要でしょうか?
4

1 に答える 1

1

衝突

複数のリポジトリの問題は、どのユーザーがどのユーザーであるかを確実に区別する必要があることです。たとえば、データが次のようになっていると仮定します

メンバーテーブル

username
----------------------
member

モデレーターテーブル

username
----------------------
moderator

次に、ユーザーに関連付けられたデータがあります

データ表

username          value
----------------------------------------
moderator         secret

衝突した場合はどうなりますか?たとえば、ユーザーがサインアップすると、メンバーテーブルは次のようになります。

メンバーテーブル

username
----------------------
member
moderator

どのモデレーターがデータを所有していますか?2人のユーザーを区別する方法はありません。

代替アプローチ

別のアプローチは、ユーザーからロールへのマッピングを使用することです。次のようなものを使用することになります。

メンバーテーブル

username           is_moderator
----------------------
member             false
moderator          true

次に、ユーザーが既存のユーザー名でサインアップしようとすると、制約違反が発生するため、2つを区別する必要はありません。もちろん、別のテーブルを使用してロールをマップすることもできます。これは、SpringSecurityがauthoritiesテーブルを使用して通常行うことです。

複数のUserDetailsS​​erviceを使用する

とにかく複数のユーザーリポジトリを本当に使用したい場合は、構成で複数のUserDetailsS​​erviceエントリを宣言するだけです。インメモリ構成の例を以下に示します。


  <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の付録を参照してください。

于 2012-09-04T21:27:26.017 に答える