Grails 2.1.0 app tomcat 7.0.22重定向后会话空

时间:2012-08-01 09:45:41

标签: grails session-variables tomcat7 ajp

我只是在学习grails并且遇到一个问题,当我在Netbeans中运行它时,该应用程序工作正常但在Centos 5.4服务器上部署到Tomcat 7.0.22时显示出奇怪的行为。我正在使用proxy_ajp通过apache使应用程序可用。

问题似乎是重定向后会话未被维护,因此我丢失了导致应用尝试再次登录的登录信息。

我的proxy_ajp设置是

<Location /PreyerBooks >
   ProxyPass ajp://localhost:8011/PreyerBooks    
   ProxyPassReverse ajp://localhost:8011/PreyerBooks
</Location>

应用程序正在部署而没有错误,并且与数据库和LDAP的连接正在运行。我通过登录验证方法测试了这个,如下所示

UserController - 身份验证功能

 def authenticate = {
    def password=passhash(params.password)
    log.info " login attempt ${params.login} - ${params.password} - ${password}"
    def match = User.findAll(
      directory: "user",
      filter: "(&(uid=${params.login})(userpassword=${password}))"
    )
    log.info " match ${match}"
    if (match) {
      def user = Employee.findByLogin(params.login)
      log.info " user ${user} - ${user?.role}"
      if(user){
        session.user = user
        log.info "success"
        flash.message = "Hello ${user.firstname}!"
        redirect(controller:"Book", action:"index")      
      }else{
        log.error "failed login attempt mismatch to ldap ${params.login}"
        flash.message = "Sorry, ${params.login}. Please try again."
        redirect(action:"login")
      }
    }else{
      log.error "failed login attempt ${params.login} - ${params.password}"
      flash.message = "Sorry, ${params.login}. Please try again."
      redirect(action:"login")
    }
  }

BookController - auth函数(检查是否已登录)

  def beforeInterceptor = [action:this.&auth, except:[]]

  def auth() {
    log.info "BookController:auth() ${session}"

    if(!session.user) {
      redirect(controller:"User", action:"login")
      return false
    }
    log.info "BookController:auth() working"
    return true
  }

日志显示

 INFO  books.UserController  -  login attempt username - password - passwordhash
 INFO  books.UserController  -  match [de.preyer.books.User@d4a1cc]
 INFO  books.UserController  -  user username - admin
 INFO  books.UserController  - success
 INFO  books.BookController  -  BookController:auth() Session Content:

session.user变量已经消失。我检查了passwordhash并且它正确匹配LDAP服务器(因此匹配中的对象引用)。在获得其角色的数据库中正确找到此用户。

我无法直接访问应用程序,因为端口在防火墙中被阻止而无法打开apache ajp,我无法打开它。因此我无法测试问题是否在ajp或tomcat中一般

我尝试搜索指定为标题的条件,但没有找到任何相关内容。

a)浏览器cookie启用并正常工作,我尝试了Safari,Firefox和Chrome但没有成功。我不认为这是一个浏览器问题,因为相同的浏览器在NetBeans中使用应用程序(我认为使用jetty)

b)我已将grails.serverURL = "http://servername/PreyerBooks"设置为完全限定域

如果我关闭了身份验证应用程序。

我必须做错事或错过了部署中的一步。

现在我知道我可以使用Spring Core包含一个插件,但这对我的应用程序来说太过分了,并且为调试增加了更多的复杂性。我希望在继续之前让当前的实现工作。逻辑是从Grails 2.1.0文档中复制的,因此它应该可以工作。

我在httpSession中读到事情必须是可序列化的,但是如果文档中的示例不起作用,为什么我在NetBeans中运行它时应用程序会工作?

我不知所措。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

使用spring-security-core插件(或Shiro,或任何已建立的,经过验证的安全实现)。它并不复杂,滚动自己的安全性是一个快速入侵的途径。