【问题标题】:Logging specific request header using spring security events使用 Spring 安全事件记录特定的请求标头
【发布时间】:2012-04-09 20:16:36
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: grails spring-security


    【解决方案1】:

    你可以从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

    【讨论】:

    • GrailsWebRequest request = RequestContextHolder.currentRequestAttributes() 有效!非常感谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-31
    • 1970-01-01
    • 2019-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-27
    相关资源
    最近更新 更多