【问题标题】:Can interceptors be executed between authentication and action execution?可以在身份验证和操作执行之间执行拦截器吗?
【发布时间】:2016-11-03 04:43:26
【问题描述】:

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

  1. 调用安全资源
  2. 拦截器栈拦截请求,返回true
  3. 重定向到表单登录页面
  4. 身份验证成功
  5. 重定向到请求的资源

我们有拦截器,应该只为经过身份验证的用户触发。有没有办法让拦截器在第 4 步和第 5 步之间执行而不是这个流程?或者这是我们的拦截器逻辑需要移入 Spring Security 过滤器的地方?

【问题讨论】:

  • 我和这个问题有同样的要求,但我无法理解答案。我编写了从 intellij 或 grails run-app 运行时运行良好的拦截器,但是当我将它作为 war 文件部署到 tomcat 中时,所有的地狱都失败了。我的令牌已通过身份验证,但我得到 springSecurityService.principal = null。详细信息在这个问题中。

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


【解决方案1】:

如果您查看 2.x 应用程序中的流程会更清楚一点,因为有一个 web.xml 文件,其中更清楚几个部分的运行顺序,但在 2.x 和3.x.

插件的过滤器链注册为一个过滤器,并配置为在grailsWebRequest 过滤器之后但GrailsDispatcherServlet 之前运行。这是为了支持可能具有不同于默认 URL 映射的带注释的控制器(例如,PersonController.show() 可能映射到 /person/show,但应用程序可以将其映射到任何有效的 uri(以及 REST 动词的组合),所以我需要能够搜索已编译的 URL 映射实例以找出将为当前请求运行的控制器操作。在过滤器中,我知道正在请求什么 URL,但不知道要应用什么安全规则;如果一切都是基于 url 的,它会很简单并且在启动时预编译,但是对于带注释的控制器,我只知道哪些规则适用于控制器方法。

servlet 在过滤器之后运行,这就是控制器被确定和调用的地方。拦截器(以及 2.x 中的 Grails 过滤器(不要与 servlet 过滤器混淆))实际上是 Spring HandlerInterceptors,它与“处理程序”一起组合成 HandlerExecutionChain。这足够通用,可以处理任何类型的请求,但实际上处理程序是一个控制器,因此范围比 servlet 过滤器要窄得多。

所以回到您的实际问题,您最好的选择是在添加到 Spring Security 过滤器链的过滤器中完成工作。这些实现起来非常简单,过程在plugin docs 中进行了描述。

【讨论】:

  • 我和这个问题有同样的要求,但我无法理解答案。我编写了从intellijgrails run-app 运行时工作正常的拦截器,但是当我将它作为war 文件部署到tomcat 中时,所有的地狱都失败了。我的令牌通过了身份验证,但我得到了springSecurityService.principal = null。详情在此question
猜你喜欢
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 2011-02-19
  • 2016-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多