Я понимаю, что это старый вопрос, но этот ответ может помочь будущим поисковикам.
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.