Spring FORM_LOGIN_FILTER是否支持ConcurrentSessionControl?

时间:2015-05-22 07:28:31

标签: java spring-mvc java-ee spring-security

我正在进行基本的弹簧安全设置。这是我的spring-security.xml配置:

<http auto-config='false' entry-point-ref="authenticationEntryPoint">
        <custom-filter position="FORM_LOGIN_FILTER" ref="authenticationFilter" />
        <logout delete-cookies="JSESSIONID" logout-success-url="/" />
        <!-- <session-management > <concurrency-control max-sessions="1" error-if-maximum-exceeded="true" 
            expired-url="/"/> </session-management> -->
            <session-management session-authentication-strategy-ref="sas"/>
    </http>

    <beans:bean id="authenticationFilter" class="com.diners.security.AuthenticationFilter">
        <beans:property name="authenticationManager" ref="authenticationManager" />
    </beans:bean>

    <beans:bean id="authenticationEntryPoint"
        class="org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint">
        <beans:property name="loginFormUrl" value="/index.jsp" />
    </beans:bean>

    <beans:bean id="concurrencyFilter"
        class="org.springframework.security.web.session.ConcurrentSessionFilter">
        <beans:property name="sessionRegistry" ref="sessionRegistry" />
        <beans:property name="expiredUrl" value="/" />
    </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" />

    <authentication-manager alias="authenticationManager">
        <authentication-provider>
            <user-service>
                <user name="kalai"
                    password="test"
                    authorities="ROLE_ADMIN" />
                <user name="magesh"
                    password="test"
                    authorities="ROLE_USER" />
            </user-service>
        </authentication-provider>
    </authentication-manager>

我正在使用自定义表单登录过滤器。我想要登录的并发控制,以便用户一次只能有一个会话。在当前会话到期或手动注销之前,他不应该能够登录其他浏览器。

某些人声称添加以下侦听器将解决此问题。所以我在web.xml中添加了以下内容

<listener>
        <listener-class>org.springframework.security.web.session.HttpSessionEventPublisher</listener-class>
    </listener> 

但它也没有帮助我。然后我在一些帖子中发现,登录过滤器不支持concurrentsessioncontrol。

我需要实施任何东西吗?任何人都可以就此提出建议或者您能否提供替代方案?我有一个自定义过滤器,用于在成功和不成功的身份验证时提供json响应。

非常感谢任何帮助之手。

1 个答案:

答案 0 :(得分:0)

是的,它支持。将以下内容添加到authenticationFilter bean

    <property name="sessionAuthenticationStrategy" ref="sas" />