gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 08:43:38 25 4
gpt4 key购买 nike

我有一个接受表单POST的 Controller 。 Controller 的此方法/操作受 Spring Security 保护。在这种情况下,用户的 session 已过期,他们单击提交按钮。

Spring security正在创建一个保存的请求并将用户重定向到登录页面。登录后,Spring Security 将重定向到表单的 POST url。但是, Controller 方法/操作中的参数为空( Controller 和操作名称除外),并且命令对象未填充。

使用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}"
}
}
}

关于为什么 Controller 操作/方法的参数和命令对象是空且未绑定(bind)的任何想法?我希望成功登录后,保存的请求将用于填充两个参数,然后依次使用命令绑定(bind)到参数。

我已经使用 Grails 2.0.4、Spring Security Core Plugin 1.2.7.3 以及 Grails 2.4.2 和 Spring Security Core Plugin 2.0-RC3 对此进行了测试。

最佳答案

由于这似乎留给您(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
}
}
}
}
}
}

关于spring - Grails 和 Spring Security - 保存的请求 - 空参数和未绑定(bind)的命令对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24787790/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com