3

私はちょうど 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 のアプリで動作するため、これはブラウザーの問題ではないと思います (jetty を使用すると思います)。

b)grails.serverURL = "http://servername/PreyerBooks"完全修飾ドメインに設定しました

認証をオフにすると、アプリは機能します。

何か間違ったことをしているに違いないか、展開のステップを逃したのです。

これで、Spring Core を使用してプラグインを含めることができることがわかりましたが、これは私のアプリケーションにとってやり過ぎであり、デバッグがさらに複雑になります。先に進む前に、現在の実装を機能させたいと考えています。ロジックは Grails 2.1.0 のドキュメントからコピーされているため、動作するはずです。

httpSessionでシリアライズ可能である必要があることを読みましたが、ドキュメントの例が機能しない場合、NetBeans で実行するとアプリが機能するのはなぜですか?

私は途方に暮れています。どんな助けでも大歓迎です。

4

1 に答える 1

0

spring-security-core プラグイン (または Shiro、または確立された実績のあるセキュリティ実装) を使用します。複雑なことではありません。独自のセキュリティを展開することは、ハッキングへの近道です。

于 2012-08-02T03:44:49.740 に答える