Доступ к HttpServletRequest во время аутентификации DaoAuthenticationProvider в Spring Security - PullRequest
4 голосов
/ 24 марта 2012

Мне нужен доступ к объекту HttpServletRequest из моего DaoAuthenticationProvider в Spring Security.

Компонент безопасности расширяет DaoAuthenticationProvider, и мы переопределяем метод authenticate для выполнения некоторой пользовательской аутентификации / проверки. Дополнительная проверка требуется для проверки IP-адреса пользователя, который указывается в URL-адресе запроса в качестве параметра строки запроса (например: http://domain.com/context?ip=192.168.0.1).

В настоящее время я пытаюсь использовать RequestContextHolder thread-local и получить запрос http в моем пользовательском DAOAuthenticationProvider.

Некоторые другие решения, которые я читаю здесь и на весенних форумах, похоже, предлагают внедрить AuthenticationDetailsSource, использование custom-filter и другие шаги, которые я не понимаю из-за того, что не знаком с весенней безопасностью.

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

Может ли кто-нибудь указать мне правильное направление или помочь мне с какими-либо ранее реализованными подходами?

Ответы [ 2 ]

3 голосов
/ 25 марта 2012

Вы можете использовать RequestContextHolder, и он фактически содержит тот же запрос, хотя Spring Security обычно упаковывает входящий запрос, поэтому вы можете получить другую ссылку в зависимости от того, поместите ли вы RequestContextFilter до или после цепочки Spring Security.(обратите внимание, что вы можете легко проверить это самостоятельно, сравнив значение, возвращаемое из RequestContextHolder с запросом в контроллере приложения.)1007 *

package com.mycompany;

public class MyWebAuthenticationDetailsSource implements AuthenticationDetailsSource {
    public Object buildDetails(Object context) {
        return ((HttpServletRequest)context).getParameter("ip");
    }
}

Затем используйте

<bean id="ads" class="com.mycompany.MyWebAuthenticationDetailsSource />

<bean id="formLoginFilter" class="org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter">
    <property name="authenticationDetailsSource" ref="ads" />
    <property name="authenticationManager" ref="authenticationmanager" />
</bean> 

и добавьте его в качестве пользовательского фильтра, как описано в справочном руководстве.В 3.1 пространство имен поддерживает это непосредственно в элементе form-login .Authentication.getDetails() вернет значение вашего параметра "ip".

Обратите внимание, что вы, вероятно, не должны использовать 3.0.4, поскольку он имеет известные уязвимости безопасности.

Также, вы можете объяснить, как устанавливается параметр "ip"?

1 голос
/ 25 марта 2012

Вы можете добавить Spring * RequestContextFilter в ваш web.xml.Таким образом, атрибуты будут сохраняться в текущем потоке при каждом запросе.Затем вы можете получить оригинальный HtttpServletRequest:

ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
HttpServletRequest request = attributes.getRequest();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...