2014-09-22 10 views
2

Я тестируя Apache Shiro и только что построили простую демонстрацию, расположенный на https://github.com/pires/simple-shiro-web-appApache Shiro и JSESSIONID

Это только простое использование Сиро, где он пытается выполнить проверку подлинности с jdbcrealm. Каждая вещь работает отлично, за исключением

  • Shiro не меняет SESSIONID после успешной аутентификации . Это означает, что SESSIONID является таким же, когда пользователь прибывает на страницу входа в систему, а также после аутентификации пользователя.

  • отметил также, что после успешной аутентификации, если я закрою
    браузер, в следующий раз я открыть и перейти на страницу, мне нужно войти снова.

Это обычное поведение сиро. Если да, то почему?

ответ

0

AFAIK shiro не изменяет идентификатор сеанса при входе в систему. Я использовал его в своем проекте и не видел признаков того, что он меняет идентификатор сеанса. Я думаю, что это просто функция, которую они не поддерживают. Когда я переключился на весну, у меня были всевозможные проблемы, потому что весна поддерживает это поведение.

Что касается вашего второго пункта, я бы предположил, что это имеет какое-то отношение к долголетию сессии. Вероятно, этот сеанс завершен только до тех пор, пока браузер не закроется. Если Сиро использует переписывание URL для поддержания сеанса, ему придется запросить другой логин, поскольку суффикс идентификатора сеанса на URL-адресе будет потерян. С помощью cookie это поведение может поддерживаться, хотя типичный способ сделать это - использовать cookie-файл с помпом.

+0

Ну мне любопытно, есть ли у нас возможность в Сиро, чтобы держать печенье, чтобы идентифицировать сеанс пользователя, пока время на стороне сервера. В этом случае требуется изменить sessionid при аутентификации, чтобы избежать атак на фиксацию сеанса. Как побочная заметка, помните, что функция в сиро не дает того, что я ожидаю. – SashikaXP

+0

было запрошено;) https://issues.apache.org/jira/browse/SHIRO-170 Перейдя на весеннюю безопасность, я нашел весеннюю безопасность, чтобы иметь несколько дополнительных функций безопасности над сиро. –

1

Как уже говорилось, сиро не генерирует новый идентификатор при входе пользователя в систему. Вы можете легко это реализовать себя, хотя:

@Override 
protected boolean executeLogin(final ServletRequest request, final ServletResponse response) 
     throws Exception 
{ 
    final AuthenticationToken token = createToken(request, response); 
    if (token == null) 
    { 
     throw new IllegalStateException("Your error message here"); 
    } 
    try 
    { 
     // Stop session fixation issues. 
     // https://issues.apache.org/jira/browse/SHIRO-170 
     final Subject subject = getSubject(request, response); 
     Session session = subject.getSession(); 
     // Store the attributes so we can copy them to the new session after auth. 
     final LinkedHashMap<Object, Object> attributes = new LinkedHashMap<Object, Object>(); 
     final Collection<Object> keys = session.getAttributeKeys(); 
     for (Object key : keys) 
     { 
      final Object value = session.getAttribute(key); 
      if (value != null) 
      { 
       attributes.put(key, value); 
      } 
     } 
     session.stop(); 
     subject.login(token); 
     // Restore the attributes. 
     session = subject.getSession(); 
     for (final Object key : attributes.keySet()) 
     { 
      session.setAttribute(key, attributes.get(key)); 
     } 
     return onLoginSuccess(token, subject, request, response); 
    } 
    catch (AuthenticationException e) 
    { 
     return onLoginFailure(token, e, request, response); 
    } 
} 

Reference

Смежные вопросы