登录和注销后,Spring Security重定向回引用URL

时间:2012-11-12 20:49:52

标签: spring grails redirect spring-security grails-plugin

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

class BookController {

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

我的LoginController是:

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

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

例如: 用户未登录。他在家/索引并且想要访问book / create,这仅适用于已登录的用户。在这种情况下,Spring Security会将用户重定向到login / auth和(在他成功登录后)到/(这是基本URL)。

我希望将重定向转到用户尝试访问的网址,在本例中为book / create。任何其他行动也应如此。如果主页/索引上的未登录用户尝试访问book / show / 32333,他将被重定向到login / auth,并在成功登录后返回book / show / 32333。

我该如何实现?

1 个答案:

答案 0 :(得分: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而不是他以前的页面。 。

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