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

时间:2011-12-28 11:33:30

标签: grails spring-security gsp

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

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

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

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

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

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

可悲的是,这对我不起作用。任何人都可以帮忙吗?

2 个答案:

答案 0 :(得分:2)

你的标签使用没有任何主体(直接调用sec.ifAnyGranted等同于使用没有任何主体的标签)的原因不会产生你期望的结果是ifAnyGranted标签以下列方式实现: / p>

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

您可以修改代码实施以满足您的要求。尝试这样的事情:

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

您必须将以下语句添加到spring security taglib。

    static returnObjectForTags = ['ifAnyGranted']

或者,如果您不想直接修改spring security taglib,可以创建一个新的taglib和相应的标记来实现“ifAnyGranted”的您的版本。 我会推荐后者。其中一个原因是,如果您选择以前的方法,则每次决定升级插件时都必须修改spring安全标记lib。

答案 1 :(得分:1)

您可以直接在视图中使用SpringSecurityUtils.ifAnyGranted(角色)。

或者,您可以将body传递给sec.ifAnyGranted(角色:'逗号分隔字符串','字符串为正文')