2

少なくとも、変数に設定されていない場合Controllerにリダイレクトするすべてのフィルターを定義しようとするまで、正常に動作する Grails 2.1.1 アプリケーションがあります...index.gspusersession

何を試しても、サーバーの起動時に「/ index」にリダイレクトしたり、「/ index」をレンダリングしたりできません-フィルターを削除してAuthenticationController、falseパラメーターから「/ 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
    }
  }
  ....
}

ここで、Filters 定義をコメントアウトするとall、すべてがうまく機能します。起動時に表示されるページ (index.gsp) を取得しました。エラーがある場合は、問題なくページにLoginCommandリダイレクトされます。フィルター定義でindex.gspコメントすると、 .all404

Grails : どのコントローラーにもない index.gsp にリダイレクトする Grails 2.0 にアップグレード: /index.gsp が見つからない

でも運が無かった…

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フィールドを確認することで簡単に確認できます。ユーザーがコントローラーによってサイトに参照されていない場合は、 nullor ""(空の文字列) になります。

また、この問題はすべて API によってバックエンドされているため、認証のためにアプリケーション内でデータベースを使用していません。そこで、UserService.groovyとして機能するクラスを作成し、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 に答える