【问题标题】:Grails 2.1.0 app tomcat 7.0.22 Session empty after redirectGrails 2.1.0 app tomcat 7.0.22 重定向后会话为空
【发布时间】:2012-07-30 04:40:21
【问题描述】:

我只是在学习 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 - 身份验证功能(检查是否登录)

  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 变量已消失。我检查了密码哈希,它与 LDAP 服务器正确匹配(因此匹配中的对象引用)。此用户在其获得其角色的数据库中正确找到。

我无法直接访问该应用程序,避免使用 apache ajp,因为该端口在防火墙中被阻止并且我无法打开它。因此,我无法测试问题是否出在 ajp 或 tomcat 中

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

a) 浏览器 cookie 已启用并正常工作,我尝试了 Safari、Firefox 和 Chrome,但均未成功。我认为这不是浏览器问题,因为相同的浏览器可以在 NetBeans 中使用该应用程序(我认为使用码头)

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

如果我关闭身份验证,应用程序将正常运行。

我一定是做错了什么或者错过了部署中的一个步骤。

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

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

我很茫然。任何帮助将不胜感激。

【问题讨论】:

  • 进一步调查表明这只是 Tomcat 7 的问题。如果我在 Tomcat 6 上安装相同的应用程序,它可以正常工作。但是,我查看了 tomcat 7 的更改,但看不到其中之一应该导致这种情况。

标签: grails session-variables tomcat7 ajp


【解决方案1】:

使用 spring-security-core 插件(或 Shiro,或任何已建立的、经过验证的安全实现)。这并不复杂,而且您自己的安全机制是被黑客入侵的捷径。

【讨论】:

  • 我很理解这个概念,但该解决方案的复杂性使得识别潜在问题变得更加困难。一旦应用程序稳定,我几乎肯定会使用 spring-security-core 插件。
猜你喜欢
  • 2012-05-18
  • 2021-02-22
  • 2016-06-07
  • 1970-01-01
  • 2017-03-31
  • 2012-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多