0

私はSpring Securityを使用しています。Userに属するがあるとしましょうStore。にはStore、オンライン ショップがあるかどうかを決定するプロパティがあります。

class Store {
    ...
    boolean isOnline
    ...
}

class User {
    ...
    def belongsTo = [ store: Store ]
    ...
}

Storeすべての単一ページに表示されるグローバル ナビゲーション バー テンプレートで、現在ログインしているユーザーがオンライン ショッピング可能である場合にリンクを表示したいと考えています。現在、ツールバー テンプレートでこのコードを使用しています。

<g:set var="userId" value="${sec.loggedInUserInfo(field: 'id') as Long}"/>
<g:set var="user" value="${User.get(userId)}"/>

<g:if test="${user.store.isOnline}">
    <li>
        <g:link controller="store" action="redirect">Shop Online</g:link>
    </li>
</g:if>

このコードは機能しますが、このロジックを処理するより良い方法はありますか? 私は、すべてのページ レンダリングに対してこのコードを実行しているのが特に好きではありませんUser.get()。また、ビューで直接使用しているのも特に好きではありません。

言い換えれば、実際のオブジェクトspringSecurityService.currentUserを取得してその関係をたどることができるビューに相当するものはありますか?User

4

3 に答える 3

0

このロジックをフィルターに移動できます。

class UserFilters {

   SpringSecurityService springSecurityService

   def filters = {
       loadUser(controller: '*', action: '*') {
           before = {
              def user = springSecurityService.currentUser
              request.setAttribute('currentUser', user)
           }
       }
   }

}

したがって、ビューから使用できるようになりcurrentUserます:

<g:if test="${currentUser.store.isOnline}">
  ...
</g:if>

フィルタの詳細: http://grails.org/doc/latest/guide/theWebLayer.html#filters

于 2013-05-09T04:40:18.447 に答える