这不是一个简单的问题。所以让我详细解释一下......
背景: 在我的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。 事实证明:
答案 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()
。