如何动态生成grails.plugins.springsecurity使用的URL?

时间:2011-06-17 05:33:35

标签: grails spring-security

这不是一个简单的问题。所以让我详细解释一下......

背景: 在我的grails应用程序中,我有这个映射:

class UrlMappings {
    static mappings = {
        "/$storeId/$controller/$action?/$id?"
        ...
    }
}

这意味着我的应用程序将处理的所有url都具有前面的url参数“storeId”。所有控制器都将使用此参数来呈现内容并执行其他操作......

我还有带注释的控制器

@Secured(['IS_AUTHENTICATED_REMEMBERED'])
class SomeController {
    def index = {   
        // ...
    }
}

假设用户正在尝试访问此页面:

/555/some/index

如果这是未经身份验证的用户,则security-plugin会将其重定向到

/login/auth

问题是: 当spring-security将重定向到此页面时,用户将看到404.这是因为登录控制器将只处理像

这样的URL
/555/login/auth

问题是: 我该怎么做才能动态构建这个网址?

P.S。 事实证明:

  • 有配置参数 春天安全,叫 “auth.loginFormUrl”。但这只是 静态文本。我需要建立这个 url基于url对此的影响 重定向
  • 重定向完成(我不是100% 确保)在org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint #starting中。 但是如何覆盖呢?

1 个答案:

答案 0 :(得分:2)

通常这是一个静态值,但它是从LoginUrlAuthenticationEntryPoint.getLoginFormUrl()调用的,因此您可以将其子类化并在重写方法中对URL进行动态计算。该插件已经使用org.codehaus.groovy.grails.plugins.springsecurity.AjaxAwareAuthenticationEntryPoint对其进行了子类化,因此您应该扩展它。

要注册您的实现而不是插件,请在grails-app/conf/spring/resources.groovy中添加bean覆盖:

import com.yourcompany.yourapp.YourAuthenticationEntryPoint
beans = {
   authenticationEntryPoint(YourAuthenticationEntryPoint) {
      loginFormUrl = '/login/auth' // has to be specified even though it's ignored
      ajaxLoginFormUrl = '/login/authAjax'
      portMapper = ref('portMapper')
      portResolver = ref('portResolver')
   }
}

您无法直接访问此方法中的请求,但可以通过线程本地调用org.codehaus.groovy.grails.plugins.springsecurity.SecurityRequestHolder.getRequest()