3

我正在使用 Spring Security 进行身份验证。登录和注销按钮位于页面布局上,所有页面都使用该布局。我有一个 BookController,它需要创建操作的参数(例如,图像 ID):

class BookController {

@Secured("ROLE_USER")   
def create() {
  def someImage = params.imageId
  ...
}
@Secured("ROLE_USER")   
def show() {
  ...
}
...
}

我的登录控制器是:

class LoginController {
...
def auth() {
  ...
  redirect uri: SpringSecurityUtils.securityConfig.successHandler.defaultTargetUrl
}
...
}

这将在登录成功后将用户重定向到基本 URL。我想让用户始终被重定向到引用 URL,这是他成功登录之前的 URL。

例如:用户没有登录,他在home/index,想要访问book/create,只有登录用户可以访问。在这种情况下,Spring Security 会将用户重定向到 login/auth 并(在他成功登录后)重定向到 /(这是基本 URL)。

我想让重定向转到用户试图访问的 URL,在这种情况下是 book/create。任何其他操作也应如此。如果 home/index 上的未登录用户尝试访问 book/show/32333,他将被重定向到 login/auth,并在成功登录后返回 book/show/32333。

我该如何实施?

4

1 回答 1

0

我有以下解决方案:

        HttpSession session = request.getSession(false)
        def referUrl
        def referParamsMap
        def referParams = "?"
        if(session != null) {
            SavedRequest savedRequest = new HttpSessionRequestCache().getRequest(request, response)
            if(savedRequest != null) {
                referUrl = savedRequest.getRedirectUrl()
                referParamsMap = savedRequest.getParameterMap()
                referParamsMap.each { referParams += "${it.key}=${it.value[0]}&" }
            }
        }
        println "referUrl "+referUrl+referParams
        if(referUrl != null)
            redirect url: referUrl+referParams
        else
            redirect uri: SpringSecurityUtils.securityConfig.successHandler.defaultTargetUrl

唯一的问题是,如果未登录的用户在页面上并登录(通过单击布局 GSP 上的登录链接),他将始终被重定向到 defaultTargetUrl 而不是他之前的页面。

在这种情况下,有没有办法获得正确的网址?

于 2012-11-12T23:11:27.510 回答