Grails 确保插件中的web.xml过滤器映射附加在springSecurityFilterChain之后

Grails 确保插件中的web.xml过滤器映射附加在springSecurityFilterChain之后,grails,spring-security,Grails,Spring Security,我正试图通过一个自定义插件向Grails应用程序添加一个非常简单的DelegatingFilterProxy 我希望过滤器在springSecurityFilterChain过滤器之后执行,这样我就可以在自定义过滤器中使用特定于安全性的信息 我曾尝试使用loadAfter和loadBefore在doWithWebDescriptor中使用不同的技术,但都以相同的结果结束:我的自定义筛选器映射总是列在springSecurityFilterChain之前。下面是我当前迭代的doWithWebDes

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

我希望过滤器在
springSecurityFilterChain
过滤器之后执行,这样我就可以在自定义过滤器中使用特定于安全性的信息

我曾尝试使用
loadAfter
loadBefore
doWithWebDescriptor
中使用不同的技术,但都以相同的结果结束:我的自定义筛选器映射总是列在
springSecurityFilterChain
之前。下面是我当前迭代的
doWithWebDescriptor

def contextParams = xml.'context-param'
contextParams[contextParams.size() - 1] + {
    filter {
        'filter-name'('auditFilter')
        'filter-class'(DelegatingFilterProxy.name)
    }
}

def filterMappings = xml.'filter-mapping'
filterMappings[filterMappings.size() - 1] + {
    'filter-mapping' {
        'filter-name'('auditFilter')
        'url-pattern'('/*')
    }
}
有正确的方法吗?

grails插件提供了处理web.xml文件的附加功能。它钩住,
eventWebXmlEnd
,监听web.xml文件何时生成。一旦完成,插件将尝试在必要时重新排序servlet过滤器。它迭代所有其他插件,并在插件描述符中查找
webXmlFilterOrder
属性。如果找到该属性,它将注册所需的位置,并在遍历所有插件后重写web.xml文件

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

compile ':webxml:1.4.1'
因此,为了实现这个功能,您需要在插件描述符中添加一个
webXmlFilterOrder
属性(实际上只是一个getter)。您可以在
doWithWebDescriptor
闭包的正上方抛出它(您还需要导入
grails.plugin.webxml.FilterManager
):

getter返回一个映射,其中键是过滤器的名称,值是描述web.xml中所需位置的int。WebXmlConfig提供了一个
FilterManager
类,其中包含一些可以使用的位置常量。在本例中,
GRAILS\u WEB\u REQUEST\u POSITION
的值为1000


快速查看Spring Security核心插件描述符,它将
springSecurityFilterChain
过滤器放置在
FilterManager.GRAILS\u WEB\u REQUEST\u位置+100
,因此通过将
auditFilter
设置为任何更高的值,它将以WEB.xml的形式显示在Spring Security下面。

这很尴尬。就在那里,就在我面前。我一直在他们的插件描述中寻找他们是如何每次都获得如此精确的定位的。我太专注于
doWithWebDescriptor
,以至于错过了上面的三行!
def getWebXmlFilterOrder() {
    [auditFilter: FilterManager.GRAILS_WEB_REQUEST_POSITION + 101]
}