0

我正在使用 Spring 安全性。假设我有一个User属于 a 的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 回答
0

我建议将此逻辑移动到控制器并为该控制器准备视图(您用于导航栏的小块)。然后,您可以使用<g:include/>标签在该视图中重用控制器操作。

于 2013-05-09T06:39:23.803 回答
0

.get()通常会在访问数据库之前从二级缓存中提取,所以这不是我关心的。您的逻辑位置放错了位置。我会将您的视图逻辑放在自定义标记库中。

于 2013-05-09T14:37:18.440 回答