2

私は自分のapplicationContext-security.xmlに持っています

<session-management session-authentication-error-url="/genesis"> 
        <concurrency-control max-sessions="1" error-if-maximum-exceeded="true" expired-url="/genesis?sessionExpired=true"/> 
    </session-management>

ユーザーを単一のセッションに制限します。ただし、他のすべてのアカウントを単一のセッションに制限しながら、1 つのアカウントに複数のセッションを許可する必要があるという要件があります。

これを達成する方法について何か提案はありますか?

4

2 に答える 2

2

デフォルトの同時実行フィルターをオーバーライドします。特別なユーザーの処理をスキップ:

public class CustomConcurrentSessionFilter extends ConcurrentSessionFilter {

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException,
        ServletException {
        Authentication auth = SecurityContextHolder.getContext().getAuthentication();
        if (!auth.getName().equals("bob")) {
            super.doFilter(req, res, chain);
        }
    }

}

conf のデフォルト フィルタをカスタム フィルタに置き換えます。

<security:http ... >
    <security:custom-filter position="CONCURRENT_SESSION_FILTER" ref="customConcurrentSessionFilter"/>
</security:http>

<bean id="customConcurrentSessionFilter" class="com.domain.CustomConcurrentSessionFilter"/>
于 2013-01-18T10:34:55.087 に答える
0

(この問題に対するより完全な解決策を提供するために、ここでコメントを拡張します。)

子クラス(以下で使用)でオーバーライドgetMaximumSessionsForThisUser()し、XML構成に追加するだけです:ConcurrentSessionFiltercom.example.CustomConcurrentSessionFilter

  • SessionAuthenticationStrategyBean ( id 付き"sas")、
  • <session-management session-authentication-strategy-ref="sas" /><http>
  • <bean:property name="sessionAuthenticationStrategy" ref="sas" />あなたにUsernamePasswordAuthenticationFilter

完全なセットアップは、次の docs に示されているようになります。

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

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

<beans:bean id="concurrencyFilter"
   class="com.example.CustomConcurrentSessionFilter">
  <beans:property name="sessionRegistry" ref="sessionRegistry" />
  <beans:property name="expiredUrl" value="/genesis?sessionExpired=true" />
</beans:bean>

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

<beans:bean id="sas"
    class="o.s.s.web.authentication.session.ConcurrentSessionControlStrategy">
  <beans:constructor-arg name="sessionRegistry" ref="sessionRegistry" />
  <beans:property name="exceptionIfMaximumExceeded" value="true" />
  <beans:property name="maximumSessions" value="1" />
</beans:bean>

<beans:bean id="sessionRegistry"
    class="o.s.s.core.session.SessionRegistryImpl" />
于 2013-03-26T11:45:08.987 に答える