Я использую Wicket с проектом авторизации Wicket для своего уровня презентации, и поэтому я интегрировал его со Spring Security. Это метод, который вызывается Wicket для аутентификации для меня:
@Override
public boolean authenticate(String username, String password) {
try {
Authentication request = new UsernamePasswordAuthenticationToken(
username, password);
Authentication result = authenticationManager.authenticate(request);
SecurityContextHolder.getContext().setAuthentication(result);
} catch (AuthenticationException e) {
return false;
}
return true;
}
Содержимое (внутри) моей конфигурации Spring Security XML:
<http path-type="regex">
<form-login login-page="/signin"/>
<logout logout-url="/logout" />
</http>
<global-method-security secured-annotations="enabled" />
<authentication-manager alias="authenticationManager"/>
<authentication-provider user-service-ref="userService">
<password-encoder ref="bcryptpasswordencoder" />
</authentication-provider>
Раздел 2.3.6. Защита от атак фиксации сеанса из справочной документации гласит:
Атаки с фиксацией сеанса представляют собой потенциальный риск там, где это возможно.
злоумышленнику создать
сеанс доступа к сайту, затем
убедить другого пользователя войти с
тот же сеанс (отправив им
ссылка, содержащая идентификатор сеанса
в качестве параметра, например). весна
Безопасность защищает от этого
автоматически путем создания нового
сеанс, когда пользователь входит в систему. Если вы
не требует этой защиты, или это
конфликтует с некоторыми другими требованиями,
Вы можете контролировать поведение, используя
сеанс-фиксация-защита
атрибут, который имеет три
Варианты:
- migrateSession - создает новый сеанс и копирует существующий
атрибуты сеанса для нового сеанса. Это значение по умолчанию.
- нет - ничего не делай. Первоначальный сеанс будет сохранен.
- newSession - Создать новый "чистый" сеанс, не копируя
данные существующего сеанса.
Аутентификация работает, но я, поскольку я довольно новичок в Spring Security, у меня есть несколько вопросов, на которые мне тоже нужны ответы:
- Обычно для входа в систему я отправляю информацию аутентификации на
j_spring_security_check
и позволяю Spring Security выполнять фактический код аутентификации. Я хотел бы иметь защиту от атак фиксации сеанса, получу ли я это при выполнении программного входа в систему, как я? А если нет, что мне нужно сделать, чтобы получить его?
- Как выполнить программный выход из системы?
- Поскольку я буду использовать программный вход и выход, как отключить Spring для перехвата этих URL-адресов?
Обновление:
Для защиты от атак с фиксацией сеанса мне кажется, что мне нужно вызвать метод в классе SessionUtils с подписью startNewSessionIfRequired(HttpServletRequest request, boolean migrateAttributes, SessionRegistry sessionRegistry)
.
Как получить экземпляр SessionRegistry, который мне нужно передать? Я не могу найти способ создать для него идентификатор псевдонима или узнать, как получить его идентификатор или имя.