我的项目中有一个相当复杂的grails插件依赖项结构,我在安全插件中覆盖类时遇到问题。
我的结构有点像这样:
Web App
|_ Audit Plugin
|_ Spring Security Core Plugin
|_ Security Wrapper Plugin
|_ Audit Plugin
|_ Spring Security Core Plugin
这就是这样的原因是审计是在一些具有安全包装的应用程序之间共享的,而另一些则没有,这就是为什么它会引入Security-Core(它至少需要获取当前主体的能力) )。
同样,包装器在多个Web应用程序之间共享,因此我们将其放入插件中。我的问题是在将Spring-Security-Core升级到版本2之后出现的。
我的包装器有一个客户auth.gsp和LoginController.groovy。在旧版本的安全性中,这很好,因为插件模板化了这些并使它们在安装插件的源代码中可用。
但是现在这些文件是插件的内部文件,虽然我知道你可以在主应用程序中覆盖它们,但是当我试图在另一个插件中覆盖它们时,我会得到一些奇怪的结果。
登录页面的Spring-Security-Core版本始终覆盖我的自定义登录页面。我不能让我的优先权。
第二个问题是来自Spring-Security-Core插件的LoginController.groovy有时优先于我的包装器中的一个。构建之间似乎几乎是随机的,关于哪一个将被使用。
有没有正确的方法可以确保我的观点和控制器优先?
答案 0 :(得分:5)
好好利用我发现的解决方案似乎对我有用:
首先,我无法更改插件加载的顺序,因为安全包装器对spring bean执行了很多操作,并且必须在核心插件之后加载才能使用它。所以在经过一些挖掘(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 /**.
确保这些新位置未被锁定,以便人们可以访问它们,这似乎运作良好。我现在可靠地知道,无论他们在我的登录页面和登录控制器中加载哪个顺序。