2

ユーザーのセッション数を制限したい。

以下は、私が使用した構成例です (こちらを参照)。

<http>
  <custom-filter position="CONCURRENT_SESSION_FILTER" ref="concurrencyFilter" />
  <custom-filter position="FORM_LOGIN_FILTER" ref="myAuthFilter" />

  <session-management session-authentication-strategy-ref="sas"/>
</http>

<beans:bean id="concurrencyFilter"
   class="org.springframework.security.web.session.ConcurrentSessionFilter">
  <beans:property name="sessionRegistry" ref="sessionRegistry" />
  <beans:property name="expiredUrl" value="/session-expired.htm" />
</beans:bean>

<beans:bean id="myAuthFilter" class=
   "org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter">
  <beans:property name="sessionAuthenticationStrategy" ref="sas" />
  <beans:property name="authenticationManager" ref="authenticationManager" />
</beans:bean>

<beans:bean id="sas" class=
 "org.springframework.security.web.authentication.session.ConcurrentSessionControlStrategy">
  <beans:constructor-arg name="sessionRegistry" ref="sessionRegistry" />
  <beans:property name="maximumSessions" value="1" />
</beans:bean>

<beans:bean id="sessionRegistry"
    class="org.springframework.security.core.session.SessionRegistryImpl" />

エラーは発生せず、 のユーザー数を確認できますSessionRegistry。しかし、maximumSessions値は1であり、1 人のユーザーに対して 2 つのセッションを作成できます (そのために別のブラウザーを使用しました)。

次のプロパティでも例外は発生しませんでした: <beans:property name="exceptionIfMaximumExceeded" value="true" />. また、 UserDetails の実装をオーバーライドしようとしequals()ました(ここで提案されたように)。hashCode()

maximumSessionsこの値で 1 人のユーザーが 2 回ログインできるのはなぜですか? 他の方法でセッション数を制限する必要がありますか? 事前に感謝します。

4

1 に答える 1

2

悪いことに、equalsメソッドを。で正しくオーバーライドしませんでしたEqualsBuilderここに示されているように、.appendSuper(super.equals(obj))実際に比較が必要になる前に行があったため、同じユーザーの詳細でも異なっていました。この行がないと、すべて問題なく、2回ログインできません。

于 2012-12-09T09:45:23.403 に答える