我设置了一个过滤器,用于控制用户的登录状态。
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)中的代码。现在它正常运行,然后只执行用户未登录时的渲染行。日志记录仍然显示用户已登录并且他是代理但是然后它运行渲染而不是行它上面的代码。就好像在完成检查代理是否已登录后,在渲染行中有一个“goto”。
再次感谢任何信息或解决方案
答案 0 :(得分:0)
我在过滤器和Groovy真相方面遇到了一些问题。我看到的问题是没有记录任何错误,即使攻击性异常捕获(即捕获Throwable),浏览器中唯一的输出是空白页。这似乎只发生在过滤器中 - 其他任何地方都会记录错误。
就我而言,问题归结为Groovy的事实。我试图在会话中设置一个布尔属性,但每次我这样做都失败了。最后,我必须将值转换为String,然后设置它,并且它可以工作。
我知道这不是一个直接的答案,但我已经被上面的几次咬过,例如懒惰的GString评估。
如果你还在调试,我会记录一些输出,显示你认为你正在处理的基础类类型。可能是在上面评估您的布尔条件时,抛出并吞下异常。我会记录每个条件语句的实际值,看看它们是什么。同时逐个删除每一行,看看故障是否消失。和/或用绝对值替换你的条件,即true / false,以查看代码是否被执行。如果是,则表示当前条件评估中存在错误。