Grails& Spring Security - 保存的请求 - 空参数和未绑定的命令对象

时间:2014-07-16 18:10:00

标签: spring grails spring-security

我有一个接受表格POST的控制器。控制器的此方法/操作受Spring Security保护。在这种情况下,用户的会话已过期,他们点击提交按钮。

Spring安全性正在创建已保存的请求并将用户重定向到登录页面。登录后,Spring Security会重定向到表单的POST网址。但是,控制器方法/操作中的参数为空(控制器和操作名称除外),并且命令对象未填充。

使用onInteractiveAuthenticationEvent中的一些简单代码,我可以看到保存的请求包含参数图中的所有参数。

grails.plugins.springsecurity.onInteractiveAuthenticationSuccessEvent = { e, appCtx ->

    def request = org.codehaus.groovy.grails.plugins.springsecurity.SecurityRequestHolder.getRequest()
    def response = org.codehaus.groovy.grails.plugins.springsecurity.SecurityRequestHolder.getResponse()
    org.springframework.security.web.savedrequest.SavedRequest savedRequest = new org.springframework.security.web.savedrequest.HttpSessionRequestCache().getRequest(request, response);

    println savedRequest
    if (savedRequest) {
        savedRequest.getParameterMap().each { k, v ->
            println "${k}: ${v}"
        }
    }
}

为什么控制器动作/方法的参数和命令对象为空且未绑定的任何想法?我希望在成功登录后,保存的请求将用于填充两个参数,然后依次命令绑定参数。

我使用Grails 2.0.4,Spring Security Core Plugin 1.2.7.3以及Grails 2.4.2和Spring Security Core Plugin 2.0-RC3进行了测试。

1 个答案:

答案 0 :(得分:2)

由于这似乎是由你(Spring Security的用户)实现的,所以我决定使用Grails过滤器。我知道它可以使用Spring Security过滤器实现,并放在过滤器链中(如Spring Security API文档所示),但我需要继续处理其他事情。

所以,这是我所做的一个例子。

package com.example

class SavedRequestFilters {

    def filters = {
        // only after a login/auth check to see if there are any saved parameters
        savedRequestCheck(controller: 'login', action: 'auth') {
            after = {
                org.springframework.security.web.savedrequest.SavedRequest savedRequest = new org.springframework.security.web.savedrequest.HttpSessionRequestCache().getRequest(request, response)
                if (savedRequest) {
                    // store the parameters and target uri into the session for later use
                    session['savedRequestParams'] = [
                        uri: savedRequest.getRedirectUrl(),
                        data: savedRequest.getParameterMap()
                    ]
                }
            }
        }

        all(controller:'*', action:'*') {
            before = {
                // if the session contains dr saved request parameters
                if (session['savedRequestParams']) {
                    def savedRequestParams = session['savedRequestParams']
                    // only if the target uri is the current will the params be needed
                    if (savedRequestParams.uri.indexOf("/${controllerName}/") > -1) {
                        savedRequestParams.data.each { k, v ->
                            params[k] = v.join(",")
                        }
                        // clear the session storage
                        session['savedRequestParams'] = null
                    }
                }
            }
        }
    }
}