我正在尝试通过自定义插件向我的Grails应用程序添加一个非常简单的DelegatingFilterProxy
。
我希望过滤器在springSecurityFilterChain
过滤器后执行,以便我可以在自定义过滤器中使用某些特定于安全性的信息。
我尝试在loadAfter
中使用loadBefore
和doWithWebDescriptor
使用不同的技术,但结果都相同:我的自定义过滤器映射始终列在{{1}之前}。以下是我当前的springSecurityFilterChain
doWithWebDescriptor
有没有正确的方法来解决这个问题?
答案 0 :(得分:1)
grails WebXmlConfig插件提供了使用web.xml文件的其他功能。它挂钩到event,eventWebXmlEnd
,它在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下面。