Привет, я работаю с Spring, и у меня есть проблема с попыткой использовать контроль параллелизма и аутентификацию-отказ-url.
Я стараюсь, чтобы тот же пользователь не мог войти в приложение одновременно. Поэтому для этого я определил контроль параллелизма в security.xml как:
<concurrency-control max-sessions="1" error-if-maximum-exceeded="true" expired-url="/login_page?login_timeout=1"/>
Моя идея заключается в том, что второй пользователь попытается войти в систему, страницу входа в систему должна вызываться с помощью:
У меня тоже есть форма-логин:
<form-login login-page="/login_page" default-target-url="/index.jsp"
authentication-failure-url="/login_page?login_error=1" />
Но проблема в том, что я пытаюсь войти в систему второго пользователя, ВСЕГДА, вызывается страница входа в систему
В чем проблема? Как я могу использовать перенаправление с истекшим 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>
Мой security.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
в элемент управления сеансом.
Поэтому он используется только в том случае, если используется аутентификация с использованием аутентификации.
AuthenticationFailureHandler
для управления тем, куда перенаправляется пользователь, в зависимости от того, произошел ли сбой из-за одновременного входа в систему (когда вы получитеSessionAuthenticationException
) или по какой-либо другой причине. Тем не менее, вы также должны уточнить, что вы на самом деле пытаетесь сделать.