Spring Security / expired-url без перенаправления URL

1

Привет, я работаю с 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>

Мой 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>

Спасибо за помощь!

Теги:
spring-security
web
concurrency

1 ответ

0

Кажется, здесь немного путают некоторые параметры конфигурации здесь. Начнем с того, что атрибут expired-url не имеет отношения к делу, поскольку вы рассматриваете несколько логинов как ошибку. Он применяется только в том случае, если вы разрешите второй логин, который затем приведет к тому, что первый будет "истек". Проверьте документацию для конфигурации пространства имен.

Атрибут session-authentication-error-url здесь также не применяется. Процитировать из руководства:

Второй логин будет отклонен. Под "отклоненными" мы подразумеваем, что пользователь будет отправлен на URL-адрес аутентификации-отказа, если используется вход на основе формы. Если вторая аутентификация происходит через другой неинтерактивный механизм, такой как "помнить-меня", клиенту будет отправлена ошибка "несанкционированного" (402). Если вместо этого вы хотите использовать страницу с ошибкой, вы можете добавить атрибут session-authentication-error-url в элемент управления сеансом.

Поэтому он используется только в том случае, если используется аутентификация с использованием аутентификации.

  • 0
    Спасибо за ваш ответ. Но сессия-аутентификация-ошибка-URL не работает, если определен аутентификация-ошибка-URL. Так как же для этого "/ login_page? Login_max_session_exceed = 1" работает? Это возможно?
  • 0
    Вы можете использовать пользовательский AuthenticationFailureHandler для управления тем, куда перенаправляется пользователь, в зависимости от того, произошел ли сбой из-за одновременного входа в систему (когда вы получите SessionAuthenticationException ) или по какой-либо другой причине. Тем не менее, вы также должны уточнить, что вы на самом деле пытаетесь сделать.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню