grails - 使用 Spring Security 事件记录特定的请求 header

标签 grails spring-security

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

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

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

有什么想法如何访问 header 或任何其他方式来实现此功能吗?

最佳答案

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

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

一般来说,您可能知道,从服务内部访问 Web session 并不是一个好主意。首先,您打破了服务逻辑的抽象和分离,并且请求可能并不总是可用或与当前线程关联。从服务访问 session 的一种方法是按以下方式封装 HTTP session :

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 .

关于grails - 使用 Spring Security 事件记录特定的请求 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9870233/

相关文章:

Grails addTo 重复项

python - 从Grails 3启动python脚本

java - Spring security3 "You cannot use a spring-security-2.0.xsd schema"

spring-boot - 如何使用 Spring boot keycloak 适配器 + spring security 强制更新 oAuth token (访问 token + 刷新 token )?

java - Spring 安全3.0 : SavedRequest always null

java - AuthenticationEntryPoint 仅有时被称为

java - 未经授权的错误 : Full authentication is required to access this resource with spring. 安全 v.6

Grails 示例和示例代码片段

grails - Grails-java.sql.Date的非法参数

grails - contains()方法不起作用