从容器管理的身份验证迁移到Grails 3.1.9应用程序中的Spring Security插件。在容器管理的世界中,我们的Grails拦截器在对安全资源进行身份验证后执行。但是,使用Spring Security时,拦截器(带有before()逻辑)按以下顺序执行:
我们有拦截器,只应为经过身份验证的用户触发。有没有办法在步骤4和步骤4之间执行拦截器5而不是这个流程?或者这是我们的拦截器逻辑需要进入Spring Security过滤器的地方吗?
答案 0 :(得分:2)
如果你看一下2.x应用程序中的流程会更清楚一点,因为有一个web.xml文件,其中更清楚的是几个部分的运行顺序,但它在2.x和3.X。
插件的过滤器链被注册为一个过滤器,并且配置为在grailsWebRequest
过滤器之后但在GrailsDispatcherServlet
之前运行。这是为了支持可能具有与默认值不同的URL映射的带注释的控制器(例如PersonController.show()
可能映射到/person/show
但应用程序可能已将其映射到任何有效的uri(以及REST动词的组合( s)),所以我需要能够搜索已编译的url映射实例,以确定将为当前请求运行的控制器操作。在过滤器中,我知道正在请求的URL,但不知道要执行哪些安全规则apply;如果所有内容都是基于url的,那么启动时会很简单并预编译,但是使用带注释的控制器我只知道控制器方法适用的规则。
servlet在过滤器之后运行,这是确定和调用控制器的位置。 2.x中的拦截器(和Grails过滤器(不要与servlet过滤器混淆)实际上是Spring HandlerInterceptors,它与“处理程序”一起组成HandlerExecutionChain
。这是通用的,可以处理任何类型的请求,但实际上处理程序是一个控制器,因此范围比它是一个servlet过滤器要窄得多。
因此,为了回到您的实际问题,您最好的选择是在添加到Spring Security过滤器链的过滤器中完成工作。这些实现起来非常简单,并且在plugin docs。
中描述了该过程