我有一个接受表格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进行了测试。
答案 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
}
}
}
}
}
}