在 grails gsp 中调用标签不起作用

Posted

技术标签:

【中文标题】在 grails gsp 中调用标签不起作用【英文标题】:Invoking tag in grails gsp does not work 【发布时间】:2012-01-29 03:13:05 【问题描述】:

我正在使用 spring 核心安全插件并尝试直接从 EL 调用 <sec:ifAnyGranted /> 标签,如下所示:

sec.ifAnyGranted(roles: 'ROLE1, ROLE2, ...')

但这不起作用,因为该方法没有返回任何内容。但是,如果我尝试以下列方式使用标签,它确实有效:

<sec:ifAnyGranted roles="ROLE1, ROLE2, ...">

我不能使用第二个的原因是因为我需要结合两个标准来限制对页面中特定元素的访问,其中一个是用户参与特定的角色列表。为了实现这一点,我通过以下方式使用&lt;sec:access /&gt; 标签:

<sec:access expression="$sec.ifAnyGranted(roles:'ROLE1,ROLE2,...') || (expression 2)">
   ...
</sec:access>

很遗憾,这对我不起作用。有人可以帮忙吗?

【问题讨论】:

表达式采用文本'and','or'而不是&&, ||。 (是的,我知道这是一个古老的问题)。 【参考方案1】:

您可以直接从您的视图中使用 SpringSecurityUtils.ifAnyGranted(roles)。

或者,您可以将 body 传递给 sec.ifAnyGranted(roles:'逗号分隔字符串','string for body')

示例

<g:if test="$sec.ifAnyGranted(roles: 'ROLE_USER_BUSINESS', 'null')">
    BUSINESS
</g:if>
<g:else>
    SOMETHING TLESE
</g:else>

【讨论】:

我确实按照你的建议解决了,但还是感谢你的回答。【参考方案2】:

你使用不带body的标签(直接调用sec.ifAnyGranted相当于使用不带body的标签)没有产生你期望的结果的原因是ifAnyGranted标签的实现方式如下:

    if(springSecurityService.ifAnyGranted(comma separated roles here))
      out << body()
    

您可以修改标签实现以满足您的要求。试试这样的:

   if(springSecurityService.ifAnyGranted(comma separated roles here))
     if(!body())
       return true 
     else
     out << body();     
     
   

您必须将以下语句添加到 spring 安全标签库中。

    static returnObjectForTags = ['ifAnyGranted']

或者,如果不想直接修改spring security taglib,可以新建一个taglib和对应的tag来实现“ifAnyGranted”的你的版本。 我会推荐后者。造成这种情况的原因之一是,如果选择前一种方法,每次决定升级插件时,都必须修改 spring 安全标签库。

【讨论】:

不要编辑插件代码 - 因为您需要将其签入源代码控制或使用您自己的自定义构建,所以它使使用插件变得更加困难。只需在您的应用程序中创建您自己的标签。

以上是关于在 grails gsp 中调用标签不起作用的主要内容,如果未能解决你的问题,请参考以下文章

变量在 GSP 标签中不起作用,但在普通文本中起作用

输入类型=“日期”在引导模式下不起作用

使用布局渲染 gsp / 视图不起作用

我可以在 GSP 之外使用 grails 标签吗?

GSP:检查模型(变量)是不是为空不工作

在控制器中渲染 Grails 标签