私の挨拶。
そんな質問があります。春のセキュリティで同じ IP アドレスからのログイン数を確認する方法はありますか? つまり、この現在の IP からログインしているユーザーがいる場合、別の資格情報 (別のブラウザーからなど) でログインできないことを彼に知らせ、ログイン試行を拒否したいと思います。
私はそれをグーグルで検索しようとしましたが、以下を見つけましたが、私が探しているものではありません:
私の挨拶。
そんな質問があります。春のセキュリティで同じ IP アドレスからのログイン数を確認する方法はありますか? つまり、この現在の IP からログインしているユーザーがいる場合、別の資格情報 (別のブラウザーからなど) でログインできないことを彼に知らせ、ログイン試行を拒否したいと思います。
私はそれをグーグルで検索しようとしましたが、以下を見つけましたが、私が探しているものではありません:
AuthenticationSuccessHandler
考えられる解決策は、カスタムのペアを実装することです。これによりLogoutSuccessHandler
、(両方ともhttpリクエストにアクセスできる)、IPアドレスでキー設定されたログインユーザーの数を保持する同時マップを操作できます。次に、ログインリクエストをインターセプトし、そのマップをチェックし、IPアドレスからのユーザー数が制限を超えた場合にユーザーをリダイレクトするカスタムフィルターを追加します。
箱から出してそれを行う方法はないと思います。実際にできることは、1 つのブラウザー インスタンスからの最大接続数を制限することです (同時セッションの章を参照)。
十分でない場合は、手動で行うことができます (Spring Security で慎重に設計された拡張ポイントのおかげです)。こちら で説明されているように、カスタム フィルターを定義します。セッション レジストリのエイリアスを宣言し、すべてのプリンシパルをロードします。通常、各プリンシパルは Authentication オブジェクトによって表されます。Authentication.getDetails() には IP アドレスが含まれる場合があります。重複を見つけて、ユーザーをエラー ページにリダイレクトします。お役に立てれば。
編集。セッション レジストリのプリンシパルは実際には org.springframework.security.core.userdetails.User のインスタンスであり、Authentication ではないため、機能しません。
SessionAuthenticationStrategyは、ログイン試行を監視および制御するためのポイントです。同じユーザー名でログインされたセッションを制限するためのConcurrentSessionControlStrategyが既にありそれを拡張することも、そこから学ぶこともできます。SimpleUrlAuthenticationFailureHandlerのエラーページにリダイレクトまたは転送します。
/**
* Strategy which handles concurrent session-control, in addition to the functionality provided by the base class.
*
* When invoked following an authentication, it will check whether the user in question should be allowed to proceed,
* by comparing the number of sessions they already have active with the configured <tt>maximumSessions</tt> value.
* The {@link SessionRegistry} is used as the source of data on authenticated users and session data.
* <p>
* If a user has reached the maximum number of permitted sessions, the behaviour depends on the
* <tt>exceptionIfMaxExceeded</tt> property. The default behaviour is to expired the least recently used session, which
* will be invalidated by the {@link ConcurrentSessionFilter} if accessed again. If <tt>exceptionIfMaxExceeded</tt> is
* set to <tt>true</tt>, however, the user will be prevented from starting a new authenticated session.
* <p>
* This strategy can be injected into both the {@link SessionManagementFilter} and instances of
* {@link AbstractAuthenticationProcessingFilter} (typically {@link UsernamePasswordAuthenticationFilter}).
*
* @author Luke Taylor
* @since 3.0
*/
public class ConcurrentSessionControlStrategy extends SessionFixationProtectionStrategy