【问题标题】:Grails filter stops working afterGrails过滤器停止工作后
【发布时间】:2014-02-18 20:34:32
【问题描述】:

我设置了一个过滤器来控制用户的登录状态。

class SecurityFilters {
  def filters = {
    login(controller:'login|logout|proxy|API|error', action:'*', invert: true) {
      before = {
        if (!session.isLoggedIn){
          switch(controllerName){
            case "enroll":
              switch(actionName){
                ...
                default:
                  log.warn "Permission Denied. Default action for enroll."
                  render(view: '/permissionDenied', model: [message: "You must be logged in to access the enroll system.  If you are a consumer, please contact your agent for more information."])
                  break
              }
              break
          ...

        }
        else {
          switch(controllerName){
            case "agent":
              if (!session.user.isAgent) {
                render view: "/permissionDenied", model: [message: 'This portion of the site is only available to agents.']
                return false
              }
              break

            ....
          }// switch
        }// else
      }// before
      ...
    }// login
  }// filters

我遇到的问题是,当我在开发中运行它时,它运行良好,但是当我在我们的 QA 系统上运行它时,它运行了一段时间,然后突然停止正常运行。

我添加了日志记录,我可以看到过滤器中提供了会话信息,并且会话变量 (session.user.isAgent) 设置正确 (true) 但 if(!session.user.isAgent) 中的代码无论如何都会被执行。

我似乎可以找到奇怪行为的原因。

我的问题是,之前有没有人看到过这种行为,他们是如何解决的,或者对在哪里寻找过滤器工作方式突然变化的可能原因有任何想法。

提前致谢。

更新(2014 年 2 月 19 日): 在添加更多日志以寻找原因后,过滤器没有像以前那样执行 if(!session.user.isAgent) 中的代码。现在它正常运行,然后仅在用户未登录时执行渲染行。日志记录仍显示用户已登录并且(s)他是代理,但随后它运行渲染但不运行上面的代码。就好像在完成检查代理是否登录后,渲染行有一个“转到”。

再次感谢任何信息或解决方案

【问题讨论】:

    标签: session grails before-filter


    【解决方案1】:

    我在过滤器和 Groovy 真相方面遇到了一些问题。我看到的问题是没有记录错误,即使有积极的异常捕获(即捕获 Throwable)并且浏览器中唯一的输出是空白页。这似乎只发生在过滤器中——在其他任何地方都会记录错误。

    就我而言,问题归结于 Groovy 的真相。我试图在会话上设置一个布尔属性,但每次我这样做都失败了。最后我不得不将值转换为字符串,然后设置它,它工作了。

    我知道这不是一个直接的答案,但我已经被上面的问题咬过几次了,例如懒惰的 GString 评估。

    如果您仍在调试,我会记录一些输出,显示您认为正在处理的底层 Class 类型。当您的布尔条件在上面进行评估时,可能会抛出并吞下异常。我会记录每个条件语句的实际值以查看它们是什么。还要逐行删除每一行,看看故障是否消失。和/或用绝对值(即真/假)替换您的条件以查看代码是否被执行。如果是,则表明当前条件评估中存在错误。

    【讨论】:

    • 经过进一步研究,我认为这可能是在 2.3 中解决的错误,但不幸的是,由于它被置于维护模式,我无法将 grails 版本升级到该项目。我的临时解决方案是在每个控制器方法的顶部添加检查。丑陋,但它可以完成工作。
    猜你喜欢
    • 2016-10-14
    • 1970-01-01
    • 2017-12-02
    • 2013-12-04
    • 2016-03-14
    • 2022-11-11
    • 2011-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多