2011-12-28 3 views
1

Я использую пружинный основной плагин безопасности и попытаться вызвать <sec:ifAnyGranted /> тега непосредственно из EL так:, ссылающийся тег в Грааль GSP не работает

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

Это, однако, не работает, как ничего не вернулся из метод. Однако, если я пытаюсь использовать тег следующим образом делает работу:

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

Причины я не могу использовать второй потому, что мне нужно, чтобы объединить два критерия для того, чтобы ограничить доступ к конкретному элементу страница, одна из которых является участием пользователя в определенном списке ролей. Для достижения этой цели я использую <sec:access /> тег следующим образом:

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

К сожалению, это не работает для меня. Может ли кто-нибудь помочь?

+0

Выражение взять текст «и», «или» вместо &&, ||. (Да, я знаю, что это древний вопрос). – user2782001

ответ

1

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

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

+0

Я действительно решал его, как вы предлагаете, но в любом случае спасибо за ваш ответ. –

2

Причина, по которой использование вашего тега без какого-либо тела (вызов 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();  
    } 
    } 

Вам нужно будет добавить следующее заявление в taglib безопасности весны.

static returnObjectForTags = ['ifAnyGranted'] 

В качестве альтернативы, если вы не хотите, чтобы изменить TagLib пружины безопасности напрямую, вы можете создать новый TagLib и соответствующий тег для реализации версии из «ifAnyGranted». Я бы рекомендовал последнее. Одна из причин этого заключается в том, что если вы выберете прежний подход, вам придется изменить весенний тег безопасности каждый раз, когда вы решите обновить плагин.

+4

Не редактируйте код плагина - это затрудняет использование плагина, поскольку вам нужно проверить его в исходном элементе управления или использовать собственную собственную сборку. Просто создайте свой тег в своем приложении. –

+0

Спасибо, что оба. –

Смежные вопросы