0

Spring Security を使用すると、次のDaoAuthenticationProviderように記述できます。

http://static.springsource.org/spring-security/site/docs/2.0.x/reference/dao-provider.html

キャッシングもあります(その記事で説明されているように)。

問題は、要求が適切なユーザー名 (既にキャッシュにある) で受信されたが、パスワードが不適切な場合、適切なユーザー名/パスワードであるかのようにキャッシュからユーザーを返すことです。ユーザー名をキーとして使用するため、パスワードはまったく関係ありません。

キャッシュからユーザーを返す正確なコード:

UserDetails user = this.userCache.getUserFromCache(username);

誰かが以前にこの問題に対処したことがありますか? パスワードが同じかどうかも確認できますが、それはカスタムのものです。

ありがとうございました。

4

2 に答える 2

2

標準コンポーネントを使用してアプリケーションを構成した場合、シナリオは次のようになります。

  1. ユーザー要求が到着すると、Authenticationオブジェクトが作成され、ユーザーが指定したユーザー名とパスワードが入力されます。

  2. ユーザーの詳細が取得されます: 可能であれば、UserCache以前にキャッシュされたユーザーの詳細を取得するために使用されます (つまりgetUserFromCache、 の実装によって、UserDetailsServiceまたはの呼び出しが実行されるAuthenticationProvider AuthenticationManagerに呼び出されます)。また、キャッシュからのユーザーの詳細に適切なパスワードが含まれていても 100% OK です。

  3. 基本的な事前認証チェック (クレデンシャルの有効期限など) の後、実際の認証が行われます。この時点で、キャッシュされたユーザーの詳細からのパスワードが、Authentication提供されたオブジェクトに保存されているパスワードと比較されます (現在、間違ったパスワードが含まれています)。この時点で、認証の試行は失敗します。

ただし、独自の AuthenticationProviderまたはを実装するAuthenticationManager場合は、パスワード チェックを行う必要があります。

于 2011-01-06T14:45:20.400 に答える
0

DBからユーザーを最初に取得してキャッシュするコードは何ですか?パスワードをチェックしますか?抽象化の問題があるようです-SpringSecurityは、ユーザーがどこから来ているのか(DBまたはキャッシュ)を認識してはならず、どちらの方法でも同じロジックを使用する必要があります。

于 2011-01-05T19:25:19.390 に答える