我的项目中有一个相当复杂的 grails 插件依赖结构,并且在覆盖安全插件中的类时遇到问题。
我的结构有点像这样:
Web App
|_ Audit Plugin
|_ Spring Security Core Plugin
|_ Security Wrapper Plugin
|_ Audit Plugin
|_ Spring Security Core Plugin
之所以会这样,是因为审核是在一些具有安全包装器的应用程序和一些没有安全包装器的应用程序之间共享的,这就是它引入 Security-Core 的原因(它至少需要能够获取当前主体)。
同样,包装器在多个网络应用程序之间共享,因此我们将其放入插件中。我的问题是在将 Spring-Security-Core 升级到版本 2 后出现的。
我的包装器有一个客户 auth.gsp 和 LoginController.groovy。在旧版本的安全性中,这很好,因为插件对这些进行了模板化,并使它们在安装插件的源中可用。
然而现在这些文件是插件的内部文件,尽管我知道您可以在主应用程序中覆盖它们,但当尝试在另一个插件中覆盖它们时,我会得到一些奇怪的结果。
Spring-Security-Core 版本的登录页面始终会覆盖我的自定义登录页面。我无法让我的优先。
第二个问题是 Spring-Security-Core 插件中的 LoginController.groovy 有时优先于包装器中的 LoginController.groovy。在构建之间,使用哪一个似乎几乎是随机的。
有没有正确的方法可以确保我的视图和控制器优先?
好吧,我发现了一个似乎对我有用的解决方案:
首先,我无法更改插件加载的顺序,因为安全包装器对 spring bean 做了很多工作,并且它必须在核心插件之后加载才能工作。所以经过一番挖掘之后(默认安全配置.groovy https://github.com/grails-plugins/grails-spring-security-core/blob/master/grails-app/conf/DefaultSecurityConfig.groovy)我注意到您可以设置以下属性:
grails.plugin.springsecurity.failureHandler.defaultFailureUrl = '/login/authfail? login_error=1'
grails.plugin.springsecurity.failureHandler.ajaxAuthFailUrl = '/login/authfail?ajax=true'
grails.plugin.springsecurity.auth.loginFormUrl = '/login/auth'
因此,我创建了一个自定义控制器和登录页面,其名称与核心插件中使用的名称不同,并更改了这些属性以指向我的位置。
为了简化这一点,在包装器的 UrlMappings(名为:SecWrapperUrlMappings)中,我放置了从 /login/** 到 /seclogin/** 的映射。
确保这些新地点没有被锁定,以便人们可以访问它们,这似乎运作良好。我现在可靠地知道,无论他们在我的登录页面和登录控制器中加载什么顺序,都会使用它们。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)