我确信必须有更优雅的方式在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添加到同一个标签的高级别?
答案 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添加导入来使它看起来更好一些。