Spring Security авторизует роль доступа с подстановочным знаком - PullRequest
3 голосов
/ 07 сентября 2011

Можно ли вообще использовать подстановочный знак в свойстве доступа тега <sec:authorize />.

В настоящее время у меня есть <sec:authorize access="hasRole('TICKET_VIEW') or hasRole('TICKET_EDIT')">

, но я хотел бы иметь возможностьиспользовать <sec:authorize access="hasRole('TICKET_*')">

Возможно ли это или кто-нибудь знает обходной путь, который позволит выполнить то же самое?

Спасибо

Ответы [ 2 ]

6 голосов
/ 02 октября 2011

Это возможно в Spring EL, начиная с Spring 3.x. Вы ищете выражение hasAnyRole(..).

Так должно выглядеть так:

<sec:authorize access="hasAnyRole('TICKET_VIEW', 'TICKET_EDIT')">
    ...
</sec:authorize>

Вот ссылка на некоторые выражения Spring EL: http://static.springsource.org/spring-security/site/docs/3.0.x/reference/el-access.html

3 голосов
/ 07 июня 2013

Я понимаю, что это старый вопрос, но этот ответ может помочь будущим поисковикам.

1) Разрешить одну роль из фиксированного набора : это простой базовый случай.

<security:authorize access="hasRole('ROLE_ADMIN_ABC')">
    You are allowed to see these admin links.
</security:authorize>

2) Разрешить любую роль из фиксированного набора : В тех случаях, когда вы хотите разрешить «любую роль, начинающуюся с ADMIN», вы заранее знаете все имена ролей, и у вас просто есть Немного ролей, ответ Желенкова совершенно правильный. Однако, если у вас слишком много ролей для работы, вы, вероятно, захотите создать собственный вызов метода, который может принять решение о доступе, и вставить его в атрибут доступа с помощью SpEL. Это решение ближе к подстановочному вопросу, который был задан изначально.

<bean id="mySecurityBean" class="com.sample.MySecurityBean" />

<security:authorize access="@mySecurityBean.roleStartsWith(principal, 'ROLE_ADMIN_')">
    You are allowed to see these admin links.
</security:authorize>

public class MySecurityBean {
    /**
     * Returns true if any role starts with some prefix.
     */
    public boolean roleStartsWith(UserDetails user, String rolePrefix) {
        for (GrantedAuthority auth : user.getAuthorities()) {
            if (auth.getAuthority().startsWith(rolePrefix)
                return (true);
        }
        return (false);
    }
}

3) Разрешить одиночную роль из динамического набора : Для случаев, когда вы хотите разрешить «определенную роль, начинающуюся с ADMIN», но не обязательно знаете все суффиксы разрешенных ролей, Вы можете вставить имя роли во время рендеринга с помощью JSTL. В качестве примера рассмотрим приложение с множеством рабочих пространств, каждое с уникальным кодом. Вы хотите создать роль ROLE_ADMIN_workspaceName для каждого рабочего пространства. Когда кто-то посещает страницу рабочего пространства ABC, вы хотите, чтобы ссылки администратора отображались только в том случае, если у пользователя есть роль ROLE_ADMIN_ABC. Предположим, что каждое рабочее пространство использует одно и то же представление JSP, а имя передается в модель как $ {workspaceName}.

<sec:authorize access="hasRole('ROLE_ADMIN_${workspaceName}')">
    You are allowed to see these admin links.
</sec:authorize>

4) Разрешить любую роль из динамического набора : Это идентично решению для # 2.

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