Могу ли я управлять несколькими вкладками браузера с помощью Spring Security? - PullRequest
7 голосов
/ 25 мая 2011

Интересно, смогу ли я с помощью Spring Security проверить пользовательские сеансы, открыв только одну вкладку браузера.Возможно ли это?

Хотелось бы также узнать, смогу ли я это сделать, когда пользователь закрывает вкладку и снова открывает ее до конца своей сессии..

Я использую JSF 1.2, RichFaces 3.3.3, Hibernate и co ...

Подробно: я знаю о безопасности пружины, я просто исследую ее.1008 * Теперь спасибо и извините за мой плохой английский.

Увидимся!

Ответы [ 3 ]

5 голосов
/ 25 мая 2011

Нет. Spring Security не может определить, был ли запрос с исходной вкладки или с новой вкладки - эта информация строго на стороне клиента. От http://static.springsource.org/spring-security/site/faq.html:

2.1.

Я использую Spring Security одновременно контроль сеансов, чтобы пользователи не могли вход в систему более одного раза за раз. Когда я открываю другое окно браузера после входа это меня не останавливает от входа снова. Почему я могу войти более чем один раз?

Браузеры обычно поддерживают один сеанс на экземпляр браузера. Вы не может иметь две отдельные сессии в один раз. Так что если вы войдете снова другое окно или вкладка вы просто повторная аутентификация в том же сеансе. Сервер ничего не знает о вкладки, окна или экземпляры браузера. Все, что он видит, это HTTP-запросы и привязывает их к определенной сессии в соответствии со значением Файл cookie JSESSIONID, который они содержат. Когда пользователь аутентифицируется во время сеанс, Spring Security одновременно контроль сеанса проверяет количество другие аутентифицированные сеансы, которые они иметь. Если они уже аутентифицируется в том же сеансе, тогда повторная аутентификация не будет иметь эффект.

3 голосов
/ 06 июля 2012

Недавно я реализовал решение для нескольких вкладок / окон, используя Spring Security.Для успешного входа в систему я использую `LoginSucessHandler`` и задаю уникальное имя окна в сессии.На главной странице шаблона я установил имя окна и на каждой странице загрузки проверяю имя окна с именем окна сеанса, если оно не совпадает, то перенаправляем на страницу ошибки.

Ниже приведены конфигурации и код:

@Service
public class LoginSucessHandler extends
        SavedRequestAwareAuthenticationSuccessHandler {

    @Override
    public void onAuthenticationSuccess(HttpServletRequest request,
            HttpServletResponse response, Authentication authentication)
            throws ServletException, IOException {
        User user = (User) authentication.getPrincipal();
        String windowName = user.getUsername() + new Date().getTime();
        HttpSession session = request.getSession();
        session.setAttribute("windowName", windowName);
        session.setAttribute("windowNameToSet", windowName);
        super.onAuthenticationSuccess(request, response, authentication);
    }

}

Основной шаблон или страница заголовка:

<script>
  <%if (session.getAttribute("windowNameToSet") != null) {
        out.write("window.name = '"
            + session.getAttribute("windowNameToSet") + "';");
        session.removeAttribute("windowNameToSet");
  }%>
  if (window.name != "<%=session.getAttribute("windowName")%>") {
        window.location = "<%=request.getContextPath()%>/forms/multiwindowerror.jsp";
  }
</script>

В контексте безопасности:

<http auto-config="true" use-expressions="true">
    <intercept-url pattern="/login.hst**" access="anonymous or authenticated" />
    <intercept-url pattern="/**/*.hst" access="authenticated" />
    <form-login login-page="/login.hst"
        authentication-failure-url="/login.hst?error=true"
        authentication-success-handler-ref="loginSucessHandler" />
    <logout invalidate-session="true" logout-success-url="/home.hst"
        logout-url="/logout.hst" />
    <remember-me key="jbcp" authentication-success-handler-ref="loginSucessHandler"/>
</http>

Простоубедитесь, что в login.jsp выше JavaScript не включен.

2 голосов
/ 09 марта 2013

Я нашел более простой способ сделать то же самое. Если вы уже расширяете SimpleUrlAuthenticationSuccessHandler, подобно @Jagar, создайте список зарегистрированных пользователей, добавьте в него пользователя и добавьте его в сеанс. Затем при каждом входе в систему проверяйте, существует ли сеанс и присутствует ли этот пользователь в атрибуте массива сеансов. Если это так, то не получится, если нет, разрешите вход в систему.

Таким образом, вы можете зарегистрировать несколько пользователей в одном браузере, но не в одном и том же. Это также предотвращает возможность неправильной перезаписи атрибута windowName.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...