【问题标题】:How to dynamically generate urls used by grails.plugins.springsecurity?如何动态生成 grails.plugins.springsecurity 使用的 url?
【发布时间】:2011-06-17 05:33:35
【问题描述】:

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

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

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

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

我也有带注释的控制器

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

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

/555/some/index

如果这是未经身份验证的用户,安全插件会将他重定向到

/login/auth

问题是: 当 spring-security 将重定向到此页面时,用户将看到 404。这是因为登录控制器将仅处理 url 之类的

/555/login/auth

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

附言 原来:

  • 有配置参数 弹簧安全,称为 “auth.loginFormUrl”。但这只是 静态文本。我需要建立这个 url 基于什么 url 影响了这个 重定向
  • 重定向完成(我不是 100% 当然)在 org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint#commence。 但是如何覆盖它呢?

【问题讨论】:

    标签: grails spring-security


    【解决方案1】:

    通常这是一个静态值,但它是从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()

    【讨论】:

    • 谢谢!实际上今天找到了相同的解决方案。像魔术一样工作 =) BTW:为了覆盖 onSuccess 和 onFailure url,必须覆盖 RedirectStrategy。
    猜你喜欢
    • 2023-03-28
    • 2010-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-11
    • 2014-06-17
    相关资源
    最近更新 更多