2

我有一个运行良好的 Grails 2.1.1 应用程序,至少在我尝试为所有人定义一个过滤器Controller以重定向到变量中未设置的index.gspif之前...usersession

无论我尝试什么,我都无法在启动服务器时重定向到“/index”,也无法渲染“/index” - 如果我删除过滤器并从我AuthenticationController的错误参数中重定向到“/index”,所有工作都像魅力...

所以,这是我到目前为止所拥有的:

class AuthenticationFilters {
  all(controller:'*', action'*') {
    before = {
      def user = (User) session.getValue("user")
      if(user == null || !user.loginState) {
        redirect(controller: 'authentication', action: 'index')
        return false
      }
    }
  }
}

class AuthenticationController {
  def authenticationService

  def index = {
    render(view: '/index')
  }

  def login(LoginCommand cmd) {
    if(cmd.hasErrors()) {
      redirect(action: index)
      return
    }
  }
  ....
}

现在,如果我注释掉all过滤器定义,一切正常。我得到了启动时显示的页面(index.gsp),如果LoginCommand有错误,我将被重定向到该index.gsp页面而没有任何问题。如果我现在在all过滤器定义中评论,我会得到一个404.

我试过: Grails:重定向到不在任何控制器中的 index.gsp 升级到 Grails 2.0:/index.gsp 未找到 Grails:在 weblogic 中部署时的主要问题(及其解决方案)是什么?

但我没有运气...

我正在开发 Intellij IDEA 11.1.4 Premium(评估版)


编辑:我试图从我的类中的属性中获取User对象,被一个块包围,现在面临的问题是该属性显然不可用?为什么?sessionAuthenticationFilterstry/catchsession

try {
        def user = (User) session.getValue("user")
        if((user == null || !user.loginState)) {
            ...
        }
    } catch(Exception e) {
        println("... couldn't get user from session! ${e.getMessage()}")
    }

控制台输出:

... couldn't get user from session! No such property: session for class: grailstest001.AuthenticationFilters

对此有什么建议吗?

4

2 回答 2

4

因此,只是为了在此处添加我的经验以解决已解决的问题并供其他用户进一步使用:

要检查用户是否是第一次进入该页面,您可以通过检查该controllerName字段轻松地做到这一点。如果用户没有被任何控制器引用到该站点,则它应该是null或(空字符串)。""

此外,我没有在我的应用程序中使用任何数据库进行身份验证,因为所有这些问题都由 API 提供支持。因此,我创建了一个UserService.groovy充当 a 的类,SessionScopedBean并将所有与用户相关的信息存储在该类中。

因此,您的过滤器定义可能如下所示:

class MyFilters {
  def filters = {
    before = {
      if(!controllerName || controllerName.equals("")) {
        redirect(controller:'home',action:'index')
      }
      if(!applicationContext.userService?.getUser() || !applicationContext.userService?.getUser.isLoggedIn) {
        redirect(controller:'auth',action:'login')
      }
    }
  }
}

否则,如果您不想重定向从您的Filters.groovy课程中“新”进入您的页面的用户,您可以使用该UrlMappings.groovy课程来执行此操作。只需将您的/(根)索引映射到您想要的页面:

class UrlMappings {
  static mappings = {
    "/"(controller:'mycontroller',action:'myaction') // change it to your liking
    "/$controller/$action?/$id?" {
      constraints {
        // apply constraints here
      }
    }
    "500"(view:'/error')
  }
}
于 2012-12-04T08:20:29.687 回答
1

我认为您的过滤器语法可能不正确 - 试试

Class AuthenticationFilters {
  def filters = { // <--- added this
    all(controller:'*', action'*') {
      before = {
        def user = (User) session.getValue("user")
        if(user == null || !user.loginState) {
          redirect(controller: 'authentication', action: 'index')
          return false
        }
      }
    }
  } // <-- added
}
于 2012-11-07T17:09:25.637 回答