Grails Spring Security:需要基于用户的GSP中的if / else逻辑

时间:2014-04-28 21:01:50

标签: grails spring-security taglib

我确信必须有更优雅的方式在GSP中根据用户信息实现if / else逻辑块。

请考虑以下事项:

<g:if test="(user logged in) && (this users post) && (post replied to)">
    Show options for this post if replied to
</g:if>
<g:elseif test="(user logged in) && (this users post)">
    show options if this users post
</g:elseif>
<g:elseif test="(user logged in)">
    show options if not this users post
</g:elseif>
<g:else>
    show options if no one is logged in
</g:else>

我必须使用以下内容来确定用户是否已登录(sec.loggedInUserInfo(字段:&#39; id&#39;)!=&#34;&#34;)我知道, 我讨厌它! 我不能使用漂亮的Spring Security标签,因为它们不能满足我的要求,我试图实现自定义标签但是无法实现if / else功能(或者我可以)? 任何帮助将不胜感激。

编辑:

我创建的标签:

<g:isOwnerAndStatusEquals post="${post}" status="${Post.REPLIED_TO}">
     My post and is replied to
</g:isOwnerAndStatusEquals>

Tag lib实现:

 class AuthTagLib {

     def springSecurityService

     def isOwnerAndStatusEquals = { attrs, body ->
         def loggedInUser = springSecurityService.currentUser
         def post = attrs?.post
         def postUser = post?.user
         def postStatus = attrs?.status


         if(loggedInUser?.id == postUser?.id && job?.status?.equals(thisStatus)) {
             out << body()
         }
     }
}

以上情况都很好,但我不知道如何将if / else添加到同一个标签的高级别?

2 个答案:

答案 0 :(得分:2)

以下内容似乎与您的GSP代码相同,不需要您编写任何自定义标记:

<sec:ifLoggedIn>
  <g:if test="(this users post) && (post replied to)">
    Show options for this post if replied to
  </g:if>
  <g:elseif test="(this users post)">
    show options if this users post
  </g:elseif>
  <g:else>
    show options if not this users post
  </g:else>
</sec:ifLoggedIn>
<sec:ifNotLoggedIn>
  show options if no one is logged in
</sec:ifNotLoggedIn>

答案 1 :(得分:0)

您可以在g:if标记的测试条件中使用SpringSecurityUtils。像这样:

<g:if test="${grails.plugin.springsecurity.SpringSecurityUtils.ifAllGranted('ROLE_MYROLE')}"

它可以解决问题,因为您可以将其与其他测试结合使用。不足之处在于代码变得有些臃肿。如果你在多个地方使用它,可以通过为grails.plugin.springsecurity.SpringSecurityUtils添加导入来使它看起来更好一些。