2011-12-16 5 views
0

モデル変数をGrailsのレイアウトに渡す最も良い方法は何ですか?具体的には、UserクラスのSpringセキュリティプラグインを使用しています。また、私はこのようになりますContactクラスを持っている:レイアウト上のドメイン変数の取得

class Contact { 

    String realname 
    String company 
    String mobile 
    String fix 
    String email 
    User user 
     ... 

現在、私のレイアウト(main.gsp)に人の会社でログインして取得するためのオプションは何ですか?

答えて

1

上記の回答に追加するには、コントローラメソッドが呼び出されたときにログインするときに、ユーザーのセッション変数を設定することもできます。

あなたはまた、単にコントローラ方法で会社のためにセッション変数を設定することができ

:何かのように、

session.company = Contact.findByUser(session.user)?.company 

または

session.company = Contact.findByUser(SecurityContextHolder.context.authentication?.principal)?.company 

上記の例から、そして、あなたのmain.gspに:

<span id="companyName">${session.company}</span> 
+1

この場合、独自のauthSuccesshandlerとlogoutHandlerを実装し、この変数をコントローラにではなくセッションに入れます(ログアウト時に削除します)。 –

1

このモデルを各コントローラのレンダー時に手動で渡すのではなく、自動的に各ページに渡す必要があるということですか?あなたはそこにfiltersを使用することができます。

def filters = { 
    all(controller: '*', action: '*') { 
     before = { 
      request.setAttribute('loggedInPerson', SecurityContextHolder.context.authentication?.principal) 
      //Notice, that there is used original Authentication, from Spring Security 
      //If you need you can load your Contact object there, or something 
     } 
     after = { 

     } 
     afterView = { 

     } 
    } 
} 

とあなたのGSPでloggedInPersonを使用します。

Hello ${loggedInPerson.username}! 

ところで、Spring Security tagsが独自のフィルタを使用せずに、あなたを助けることができること、またそこにある、のように:

​​
0

モデルに特定のオブジェクトを追加する場合は、「インターセプトrs "で提供されています。特定の変数を特定のコントローラに追加するには、このようなものを使用できます。

def afterInterceptor = {model, modelAndView-> 

    model.loggedInUser = getLoggedInUser() // retrieve your user details here 

} 

そして、あなたは${loggedInUser}としてmain.gspレイアウトでloggedInUserを取得することができます。

これらの詳細を複数のコントローラで取得する必要がある場合は、BaseControllerを作成し、afterInterceptorをこのBaseControllerに入れてください。ログインしたユーザを参照する必要があるすべてのコントローラは、対応するビューでBaseControllerを拡張する必要があります。

関連する問題