确保在springSecurityFilterChain

时间:2015-11-11 20:24:11

标签: grails spring-security

我正在尝试通过自定义插件向我的Grails应用程序添加一个非常简单的DelegatingFilterProxy

我希望过滤器在springSecurityFilterChain过滤器后执行,以便我可以在自定义过滤器中使用某些特定于安全性的信息。

我尝试在loadAfter中使用loadBeforedoWithWebDescriptor使用不同的技术,但结果都相同:我的自定义过滤器映射始终列在{{1}之前}。以下是我当前的springSecurityFilterChain

迭代
doWithWebDescriptor

有没有正确的方法来解决这个问题?

1 个答案:

答案 0 :(得分:1)

grails WebXmlConfig插件提供了使用web.xml文件的其他功能。它挂钩到eventeventWebXmlEnd,它在web.xml文件生成完成时进行侦听。一旦完成,插件将尝试在必要时重新排序servlet过滤器。它遍历所有其他插件并在插件描述符中查找webXmlFilterOrder属性。如果找到该属性,则会注册所需的位置,并在遍历所有插件后重写web.xml文件。

该插件实际上已作为Spring Security Core插件的依赖项包含在内,但您还应将其添加到您自己的插件BuildConfig.groovy文件中:

compile ':webxml:1.4.1'

因此要挂钩此功能,您需要在插件描述符中添加webXmlFilterOrder属性(实际上只是一个getter)。您可以将其放在doWithWebDescriptor闭包上方(您还需要导入grails.plugin.webxml.FilterManager):

def getWebXmlFilterOrder() {
    [auditFilter: FilterManager.GRAILS_WEB_REQUEST_POSITION + 101]
}

getter返回一个Map,其中键是过滤器的名称,值是一个int,用于描述web.xml中的所需位置。 WebXmlConfig提供了一个FilterManager类,您可以使用一些位置常量。在这种情况下,GRAILS_WEB_REQUEST_POSITION的值为1000。

快速浏览一下Spring Security Core插件描述符会显示它将springSecurityFilterChain过滤器放在FilterManager.GRAILS_WEB_REQUEST_POSITION + 100,因此通过将auditFilter设置为更高的值,它将会出现在web.xml中的spring security下面。