Регистрация конкретного заголовка запроса с использованием событий безопасности Spring - PullRequest
3 голосов
/ 26 марта 2012

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

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

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

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

1 Ответ

2 голосов
/ 26 марта 2012

Вы можете получить его от 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().

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...