嗨,我正在使用Spring,在尝试使用并发控制和身份验证失败url时遇到了问题。
我尽量做到同一个用户不能同时登录应用程序。因此,我将security.xml中的并发控制定义为:
<concurrency-control max-sessions="1" error-if-maximum-exceeded="true" expired-url="/login_page?login_timeout=1"/>
我的想法是,当第二个用户尝试登录时,登录页面应该调用:
- login_page?login_max_session_exceed=1">
我也有一个表单登录为:
<form-login login-page="/login_page" default-target-url="/index.jsp"
authentication-failure-url="/login_page?login_error=1" />
但我遇到的问题是,当我试图登录第二个用户时,登录页面总是用调用的
- login_page?login_error=1"(过期的url不会重定向(
问题出在哪里?当第二个用户尝试连接时,我该如何使用过期的url重定向。
我使用的弹簧版本是:
Spring.core 3.2.8和Spring.security 3.2.3
我的web.xml
<web-app id="WebApp_ID" version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>Sistema de Despacho de Contingencia Acindar</display-name>
<servlet>
<servlet-name>sdca-dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>sdca-dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<listener>
<listener-class>org.springframework.security.web.session.HttpSessionEventPublisher</listener-class>
</listener>
<!-- Spring Security -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/sdca-security.xml
</param-value>
</context-param>
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<session-config>
<session-timeout>1</session-timeout>
</session-config>
我的安全.xml
<http auto-config="true">
<form-login login-page="/login_page" default-target-url="/index.jsp"
authentication-failure-url="/login_page?login_error=1" />
<logout logout-success-url="/login_page?logout=1" invalidate-session="true" delete-cookies="JSESSIONID" />
<session-management invalid-session-url="/login_page"
session-authentication-error-url="/login_page?login_max_session_exceed=1">
<concurrency-control max-sessions="1"
error-if-maximum-exceeded="true" expired-url="/login_page?login_timeout=1"/>
</session-management>
<intercept-url pattern="/login_page" access="IS_AUTHENTICATED_ANONYMOUSLY" />
<intercept-url pattern="/**" access="ROLE_ADMIN" />
</http>
谢谢你的帮助!
这里的一些配置选项似乎有点混乱。首先,expired-url
属性不相关,因为您将多次登录视为错误。它只适用于您允许第二次登录的情况,这将导致第一次登录"过期"。查看有关命名空间配置的文档。
session-authentication-error-url
属性在此也不适用。引用手册:
第二次登录将被拒绝。所谓"拒绝",我们的意思是,如果使用基于表单的登录,则用户将被发送到身份验证失败url。如果第二次身份验证是通过另一种非交互式机制进行的,例如"记住我",则会向客户端发送"未经授权"(402(错误。如果要使用错误页面,可以将属性
session-authentication-error-url
添加到会话管理元素中。
因此,只有在使用了类似"记住我"身份验证之类的东西时才使用它。