0

在 grails 2.2 中,我们可以让保存的 uri 在登录前重定向,如下所示。重定向 url 将保存在 session[WebAttributes.SAVED_REQUEST] 中。

def auth = {
    def config = SpringSecurityUtils.securityConfig
    def redirectURL
    DefaultSavedRequest defaultSavedRequest = session[WebAttributes.SAVED_REQUEST]
    def requestURI = defaultSavedRequest?.getRequestURI() ?: ''
    def contextPath = defaultSavedRequest?.contextPath ?: ''
    if (contextPath && requestURI.startsWith(contextPath)){
        requestURI = requestURI.substring(contextPath.length())
    }
    def id
    try{
        id = (requestURI =~ /^\/.*\/.*\/(\d+)/)[0][1]
    }
    catch(IndexOutOfBoundsException e){} // ignore
    if (requestURI.startsWith('/raceRegistration/registrationAuth') && id){
        defaultSavedRequest.parameterMap.id = id
        redirectURL = g.createLink(controller: 'stagedRaceRegistration', action: 'create', params: defaultSavedRequest.parameterMap)
    }

    if (springSecurityService.isLoggedIn()) {
        redirect uri: config.successHandler.defaultTargetUrl
        return
    }

    String view = 'auth'
    String postUrl = "${request.contextPath}${config.apf.filterProcessesUrl}"
    render view: view, model: [postUrl: postUrl,
                               rememberMeParameter: config.rememberMe.parameter,
                               requestParams: params.findAll{ key, value -> !key.matches('controller|action|id')},
                               skipUrl: redirectURL]
}

有没有办法在 grails 4 和 spring security core 4 中实现相同的功能?

这是我所做的

我从插件中复制了 Login 控制器类来覆盖 auth 方法。

默认身份验证看起来像这样,我输入了 DefaultSavedRequest defaultSavedRequest = session[WebAttributes.SAVED_REQUEST] 行。

/** Show the login page. */
def auth() {

    def conf = getConf()

    if (springSecurityService.isLoggedIn()) {
        redirect uri: conf.successHandler.defaultTargetUrl
        return
    }


DefaultSavedRequest defaultSavedRequest = session[WebAttributes.SAVED_REQUEST]



    String postUrl = request.contextPath + conf.apf.filterProcessesUrl
    render view: 'auth', model: [postUrl: postUrl,
                                 rememberMeParameter: conf.rememberMe.parameter,
                                 usernameParameter: conf.apf.usernameParameter,
                                 passwordParameter: conf.apf.passwordParameter,
                                 gspLayout: conf.gsp.layoutAuth]
}

我得到这个错误。

No such property: SAVED_REQUEST for class: org.springframework.security.web.WebAttributes. Stacktrace follows:

我完整阅读了文档,但找不到与从会话中获取保存的请求 uri 相关的任何内容?

https://grails-plugins.github.io/grails-spring-security-core/snapshot/index.html

我感谢任何帮助。谢谢!

4

1 回答 1

0

我最终使用了这个

    def savedrequest = SpringSecurityUtils.getSavedRequest(session)

    def requestURI = savedrequest.requestURI ?: ''
    def contextPath = savedrequest?.contextPath ?: ''
于 2022-01-12T05:00:58.037 回答