Вопрос по spring-security, wicket, spring, java – Программное использование Spring Security

37

я используюкалитка с Wicket Auth Project для моего уровня представления, и поэтому я интегрировал его с 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. Фиксация сессии Защита от атак В справочной документации сказано:

Session fixation attacks are a potential risk where it is possible for a malicious attacker to create a session by accessing a site, then persuade another user to log in with the same session (by sending them a link containing the session identifier as a parameter, for example). Spring Security protects against this automatically by creating a new session when a user logs in. If you don't require this protection, or it conflicts with some other requirement, you can control the behaviour using the session-fixation-protection attribute on , which has three options:

migrateSession - creates a new session and copies the existing session attributes to the new session. This is the default. none - Don't do anything. The original session will be retained. newSession - Create a new "clean" session, without copying the existing session data.

The authentication works, but I as I'm fairly new to Spring Security I have some questions which I need answers too:

Normally for login, I would POST the authentication information to j_spring_security_check and let Spring Security perform the actual authentication code. I would like to have protection against session fixation attacks, will I get it when I perform a programmatic login as I do? And if not, what would I have to do to get it? How do I perform programmatic logout? As I will use programmatic login and logout, how do I disable Spring from intercepting those URL's?

Update: Похоже, что для защиты от атак фиксации сеанса мне нужно вызвать метод в классе SessionUtils с подписьюstartNewSessionIfRequired(HttpServletRequest request, boolean migrateAttributes, SessionRegistry sessionRegistry).

Как получить экземпляр SessionRegistry, который мне нужно передать? Я не могу найти какой-либо способ создать для него идентификатор псевдонима или узнать, как получить его идентификатор или имя.

Эй, Кент, я ответил на вопросы, а ты позволил сроку действия награды - почему? Pablojim
Извините, у меня были некоторые личные проблемы, которые не давали мне войти. user14070
Награда вручается первому, который отправит ответ на три вопроса выше user14070

Ваш Ответ

6   ответов
23

это не полный ответ на ваши вопросы, но, возможно, это может вам помочь.

Код, вызываемый, когда вы НЕ используете программный вход в систему, но стандартный код можно найти здесь:

org.springframework.security.ui.webapp.AuthenticationProcessingFilter

Я думаю, вы были вдохновлены этим в вашем коде. Это выглядит очень похоже.

Аналогичным образом код выполняется при доступе к/j_spring_security_logout в стандартном подходе, можно найти здесь:

org.springframework.security.ui.logout.LogoutFilter

LogoutFilter вызывает несколько обработчиков. Используемый нами обработчик называется: org.springframework.security.ui.logout.SecurityContextLogoutHandler, так что вы можете вызвать тот же код в вашем подходе.

Какой хороший ответ! :-) Я был более чем вдохновлен справочной документацией по Spring 3.0 (три строки в моем блоке try - прямая копия-вставка):static.springframework.org/spring-security/site/docs/3.0.x/… Должен отметить, что я использую 2.0.4. Я посмотрю на код, который вы упомянули! Спасибо! Я пока оставляю вопрос открытым, так как я все еще ищу ответы на мои вопросы OP.
6

call HttpServletRequest.getSession(false).invalidate call SecurityContextHolder.clearContext()

2) Скажите Spring Security НЕ перехватывать определенные URL-адреса, это зависит от того, как настроено пространство URL вашего приложения. Если все ваши страницы (кроме / logIn и / logout) живут в контексте / myApp, то вы можете сделать это:

<http ....>
  <intercept-url pattern="/myApp/**" ..>
 ....
</http>
0

org.springframework.security.core.AuthenticationException, Например,SessionAuthenticationException, В этом случаеExceptionTranslationFilter инициировать выход.

8

править это, вы снова можете быть «вдохновлены» по коду Spring. Для создания нового сеанса вам, очевидно, понадобится доступ к httpsession, поэтому вам, возможно, придется провести некоторый рефакторинг.

Если вы видите методSessionUtils.startNewSessionIfRequired.

Это перенесет аутентификацию в новый сеанс. Вы можете вызвать этот метод напрямую или просто немного изменить код.

Что касается программного выхода из системы, вы не можете зайти слишком далеко, просто позвонивsession.invalidate() когда вам нужно выйти из системы. Это сделает все необходимое с точки зрения общей безопасности, но имейте в виду, что вам может понадобиться очистить некоторые вещи в сеансе. Если у вас очень сложный набор фильтров и т. Д., И вы должны убедиться, что пользователь вышел из системы для оставшейся части запроса, вы можете добавить:

SecurityContextHolder.getContext().setAuthentication(null);

Что касается перехвата URL, вы можете просто установить их на что-то неиспользуемое и игнорировать это! Я не уверен, что вы можете отключить перехват в конфигурации - если вы действительно хотите удалить его, взгляните наAuthenticationProcessingFilter - вы можете настроить это. Если вы сделаете это, вам придется вручную настроить xml безопасности Spring и не использовать предоставленные пространства имен. Это не так уж сложно - посмотрите на более старую документацию, и вы увидите, как это сделать.

Надеюсь это поможет!

Я создал обновление выше, так как у меня проблемы с защитой от фиксации сеанса.
SessionUtils был удален в Spring-Security 3.0, выглядит как org.springframework.security.web.authentication.session.SessionFixationProtectionStrategy.onAuthentication () (и его подкласс ConcurrentSessionControlStrategy) - его ближайшая замена.
Вам нужно ограничить количество одновременных сеансов? например позволить одному и тому же пользователю войти в систему дважды в двух разных сеансах? Если нет, вам не нужен SessionRegistry - просто передайте нулевое значение в метод SessionUtils. Если вам это нужно, то при его реализации у вас будет sessionRegistry! посмотреть здесь:static.springframework.org/spring-security/site/docs/2.0.x/…  Опять же, вам может потребоваться настроить его самостоятельно, а не использовать пользовательское пространство имен. Полагаю, вам эта функция не нужна.
0

    try {
        HttpSession session = request.getSession(false);
        if (session != null) {
            session.invalidate();
        }

        SecurityContextHolder.clearContext();

    } catch (Exception e) {
        logger.log(LogLevel.INFO, "Problem logging out.");
    }
1

authenticationManager.authenticate(...) а такжеSecurityContextHolder.getContext().setAuthentication(...) методы, но были некоторые проблемы с сессией. Мне пришлось добавить следующие строки, чтобы правильно управлять сессией:

HttpSession session = request.getSession();
session.setAttribute("SPRING_SECURITY_CONTEXT", SecurityContextHolder.getContext());

Это не было ясно из приведенного выше примера кода. Для большего взгляда наhttp://forum.springsource.org/showthread.php?t=69761

Похожие вопросы