3

これは具体的には grails 1.3.7 アプリケーションに関するものですが、新しいバージョンでも回答が機能することを願っています。以下のコードは、必要なものを簡略化したものです。accountService が注入されています。以下のスニペットは本来の機能を果たしていますが、明らかにコードが繰り返されています。これは、grails-app/conf にある UserFilter クラスにあります。

フィルターから一般的なロジックを抽出し、リダイレクトしてセッションをチェックする機能を維持するにはどうすればよいですか? セッションとフラッシュを渡してメソッドをフィルター クラスに抽出しようとしましたが、リダイレクトによってまだ問題が発生していました。

def filters = {
  // ... other filters ...
  adminAllCheck(controller: 'administration', action: '*') {
    before = {
      if(!session.isAdmin) {
        if(accountService.isAdmin()) {
          session.isAdmin = true
        } else {
          flash.message = 'Non admin'
          redirect(controller: 'home', action: 'index')
          return false
        }
      }
      true
    }
  }
  userListCheck(controller: 'user', action: 'list') {
    before = {
      if(!session.isAdmin) {
        if(accountService.isAdmin()) {
          session.isAdmin = true
        } else {
          flash.message = 'Non admin'
          redirect(controller: 'home', action: 'index')
          return false
        }
      }
      true
    }
  }
}    
4

2 に答える 2

0

Closure後で呼び出される可能性のあるコード (コントローラ ?) でa を宣言できます。

サンプル :

private def ensureSessionAdmin = {
  if(!session.isAdmin) {
    if(accountService.isAdmin()) {
      session.isAdmin = true
    } else {
      flash.message = 'Non admin'
      redirect(controller: 'home', action: 'index')
      return false
    }
  }
  true
}
def filters = {
  // ... other filters ...
  adminAllCheck(controller: 'administration', action: '*') {
    before = ensureSessionAdmin
  }
  userListCheck(controller: 'user', action: 'list') {
    before = ensureSessionAdmin
  }
}    
于 2013-03-01T23:07:19.860 に答える