使用spring安全事件记录特定请求标头

时间:2012-03-26 10:08:57

标签: grails spring-security

在我的grails应用程序中,使用Spring安全事件记录失败的登录尝试,如此处所示http://grails-plugins.github.com/grails-spring-security-core/docs/manual/guide/single.html#7.3%20Registering%20Callback%20Closures

我的问题与客户端IP检索有关。通常情况下,从事件的详细信息对象调用 getRemoteAddress 应该可以完成这项工作,但我的情况是我的应用程序在反向代理后面,因此我应该从请求标头获取ip X-Forwarded-对于

closuse的事件对象和应用程序上下文参数都不提供对请求对象的访问。全局请求对象也不可用。

有关如何访问标题或任何其他方式来实现此功能的任何想法?

1 个答案:

答案 0 :(得分:2)

您可以从RequestContextHolder获取,如果它存在:

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

通常,正如您可能知道的那样,从服务中访问Web会话并不是一个好主意。首先,您打破了服务逻辑的抽象和分离,并且请求可能并不总是可用或与当前线程相关联。从服务访问会话的一种方法是以下列方式封装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()方法。

免责声明:代码来自Marc-Oliver Scheele的blog