Вызывать тег в Grails GSP не работает - PullRequest
1 голос
/ 28 декабря 2011

Я использую подключаемый модуль безопасности Spring Core и пытаюсь вызвать тег <sec:ifAnyGranted /> непосредственно из EL следующим образом:

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 ]

2 голосов
/ 28 декабря 2011

Причина, по которой использование вашего тега без какого-либо тела (прямой вызов sec.ifAnyGranted эквивалентен использованию тега без какого-либо тела) не дает ожидаемого вами результата, заключается в том, что тег 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, вы можете создать новую библиотеку тегов и соответствующий тег для реализации вашей версии для ifAnyGranted. Я бы порекомендовал последнее. Одна из причин этого заключается в том, что если вы выберете прежний подход, вам придется изменять lib тега безопасности весной каждый раз, когда вы решите обновить плагин.

1 голос
/ 29 февраля 2012

вы можете использовать SpringSecurityUtils.ifAnyGranted (role) прямо из вашего представления.

В качестве альтернативы вы можете передать body в sec.ifAnyGranted (role: 'строка с разделителями-запятыми', 'строка для тела')

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...