拦截器可以在身份验证和操作执行之间执行吗?

时间:2016-06-30 22:12:21

标签: grails spring-security grails-plugin grails-3.1

从容器管理的身份验证迁移到Grails 3.1.9应用程序中的Spring Security插件。在容器管理的世界中,我们的Grails拦截器在对安全资源进行身份验证后执行。但是,使用Spring Security时,拦截器(带有before()逻辑)按以下顺序执行:

  1. 呼叫安全资源
  2. 拦截器堆栈拦截请求,返回true
  3. 重定向到表单登录页面
  4. 成功验证
  5. 重定向到请求的资源
  6. 我们有拦截器,只应为经过身份验证的用户触发。有没有办法在步骤4和步骤4之间执行拦截器5而不是这个流程?或者这是我们的拦截器逻辑需要进入Spring Security过滤器的地方吗?

1 个答案:

答案 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

中描述了该过程