2014-02-18 92 views
2

我有一个过滤器设置如下来控制用户登录状态。Grails过滤器停止工作后

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 )无论如何都会执行。

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

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

在此先感谢。

UPDATE(2014年2月19日): 在努力追捕导致过滤器并没有在if(!session.user.isAgent)执行的代码添加更多的日志记录,因为它是后做之前。现在它运行正常,然后只执行渲染线,当用户没有登录时。日志记录仍然显示用户已经登录并且他是代理,但是它运行渲染而不是上面的代码。这是因为如果有一个“转到”渲染线在完成代理是否登录后检查。

同样的任何信息或解决方案,将不胜感激

回答

0

我有几个问题有过滤网及Groovy的真相。我看到的问题是没有记录错误,即使采用了积极的异常捕获(即捕获Throwable),浏览器中的唯一输出是空白页。这似乎只发生在过滤器 - 在其他地方记录错误。

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

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

如果您仍在调试,我会记录一些输出,显示您认为正在处理的基础类类型。这可能是因为当你的布尔条件被评估超过一个异常被抛出和吞下时。我会记录每个条件语句的实际值,看看它们是什么。还要逐一删除每一行,以查看失败是否消失。和/或用绝对值替换您的条件,即真/假来查看代码是否被执行。如果确实如此,则指向当前条件评估中的错误。

+0

经过进一步的研究,我认为这可能是在2.3版本中解决的一个错误,但不幸的是我无法将grails版本升级到该项目,因为它被置于维护模式。我的临时解决方案是在每个控制器方法的顶部添加检查。丑陋,但它完成了工作。 –

相关问题