Регистрация заголовка конкретного запроса с использованием событий безопасности spring

В моем приложении Grails неудачные попытки входа регистрируются с использованием событий безопасности spring, как показано здесь http://grails-plugins.github.com/grails-spring-security-core/docs/manual/guide/single.html#7.3%20Регистрация%20Обратныйвызов%20Замыкания

Моя проблема связана с получением IP-адреса клиента. Обычно вызов getRemoteAddress из объекта сведений о событии должен выполнять задание, но в моем случае мое приложение находится за обратным прокси-сервером, поэтому я должен получить IP-адрес из заголовка запроса X-Forwarded- Для.

Ни объект события, ни параметры контекста приложения закрытия не предоставляют доступ к объекту запроса. Глобальный объект запроса также недоступен.

Любые идеи, как получить доступ к заголовкам или любым другим способом реализовать эту функциональность?


person dimcookies    schedule 26.03.2012    source источник


Ответы (1)


Вы можете получить его от RequestContextHolder, если он существует:

GrailsWebRequest request = RequestContextHolder.currentRequestAttributes()
request.getHeader("X-Forwarded-For")

Как правило, как вы, вероятно, знаете, доступ к веб-сеансу из Служб не считается хорошей идеей. Во-первых, вы нарушаете абстракцию и разделение сервисной логики, и запросы не всегда могут быть доступны или связаны с текущим потоком. Один из способов получить доступ к сеансу из службы — инкапсулировать сеанс HTTP следующим образом:

class WebUtilService {
    void withSession (Closure closure) {
        try {
            GrailsWebRequest request = RequestContextHolder.currentRequestAttributes()
            GrailsHttpSession session = request.session
            closure.call(session)
        }
        catch (IllegalStateException ise) {
            log.warn ("No WebRequest available!")
        }
    }
}

и вы бы использовали его так:

class MyService {
    WebUtilService webUtilService

    void doSomething() {
        webUtilService.withSession { HttpSession session ->
            log.info(session.myValue)
            session.newValue = 'Possible, but should be exceptional'
        }
    }
}

где вы могли бы иметь доступ к методу getHeader().

Отказ от ответственности: код взят из блога.

person Michael Foukarakis    schedule 26.03.2012
comment
GrailsWebRequest request = RequestContextHolder.currentRequestAttributes() работает! Большое спасибо - person dimcookies; 26.03.2012