Подтвердить что ты не робот

Как использовать <sec: authorize access = "hasRole ('ROLES)" > для проверки нескольких ролей?

Я хочу отображать некоторый контент на основе Роли, используя Spring Security JSP taglibs. Но в Spring Security 3.1.x проверяет только одну роль.

Я могу использовать, но ifAllGranted устарел.

Любая помощь?

4b9b3361

Ответ 1

В spring безопасности есть специальное выражение безопасности:

hasAnyRole (список ролей) - true, если пользователю предоставлен любой из указанные роли (заданные в виде списка строк, разделенных запятыми).

Я никогда не использовал его, но я думаю, что это именно то, что вы ищете.

Пример использования:

<security:authorize access="hasAnyRole('ADMIN', 'DEVELOPER')">
    ...
</security:authorize>

Ниже приведена ссылка на справочную документацию, где описаны стандартные выражения безопасности spring. Кроме того, здесь обсуждение, где я описал, как создать пользовательское выражение, если оно вам нужно.

Ответ 2

Ответ @dimas логически не соответствует вашему вопросу; ifAllGranted нельзя напрямую заменить на hasAnyRole.

Из Spring Security 3—> 4 руководства по миграции:

Старый:

<sec:authorize ifAllGranted="ROLE_ADMIN,ROLE_USER">
    <p>Must have ROLE_ADMIN and ROLE_USER</p>
</sec:authorize>

Новый (SPeL):

<sec:authorize access="hasRole('ROLE_ADMIN') and hasRole('ROLE_USER')">
    <p>Must have ROLE_ADMIN and ROLE_USER</p>
</sec:authorize>

Замена ifAllGranted непосредственно на hasAnyRole приведет к тому, что Spring оценит оператор, используя OR вместо AND. Таким образом, hasAnyRole вернет true, если аутентифицированный принципал содержит хотя бы одну из указанных ролей, тогда как Spring (в настоящее время устарел с Spring Security 4) метод ifAllGranted вернул true, только если аутентифицированный принципал содержал все из указанных ролей.

TL; DR: для репликации поведения ifAllGranted с использованием нового языка выражений аутентификации Spring Security Taglib необходимо использовать шаблон hasRole('ROLE_1') and hasRole('ROLE_2').

Ответ 3

Использование hasAnyRole на странице JSP может вызвать исключение для обработки страницы JSP при предоставлении ролям одинарных кавычек для метода, подобного следующему, в основном, когда страница объединена с JQuery:

<security:authorize access="hasAnyRole('ROLE_USER')"> ...
</security:authorize>

Хотя это устаревшее решение в пользу метода доступа, я думаю, что решение, предоставленное здесь, также полезно. Использование метода ifAllGranted вместо метода доступа:

<security:authorize ifAllGranted="ROLE_USER"> ...
</security:authorize>

Также обратите внимание, чтобы добавить следующий тег на страницу JSP:

<%@taglib prefix="sec" uri="http://www.springframework.org/security/tags" %>

Ответ 4

Я использовал hasAnyRole('ROLE_ADMIN','ROLE_USER'), но я получил bean создание ниже ошибки

Error creating bean with name     'org.springframework.security.web.access.intercept.FilterSecurityInterceptor#0': Cannot create inner bean '(inner bean)' of type [org.springframework.security.web.access.expression.ExpressionBasedFilterInvocationSecurityMetadataSource] while setting bean property 'securityMetadataSource'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)#2': Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [org.springframework.security.web.access.expression.ExpressionBasedFilterInvocationSecurityMetadataSource]: Constructor threw exception; nested exception is java.lang.IllegalArgumentException: Expected a single expression attribute for [/user/*]

затем я попробовал

access="hasRole('ROLE_ADMIN') or hasRole('ROLE_USER')" и он отлично работает для меня.

поскольку один из моих пользователей - администратор, а также пользователь.

для этого вам нужно добавить use-expressions="true" auto-config="true", а затем тег http

<http use-expressions="true" auto-config="true" >.....</http>

Ответ 5

Вы можете попробовать таким образом, если вы используете тимелина

sec:authorize="hasAnyRole(T(com.orsbv.hcs.model.SystemRole).ADMIN.getName(),
               T(com.orsbv.hcs.model.SystemRole).SUPER_USER.getName(),'ROLE_MANAGEMENT')"

это вернет true, если у пользователя есть упомянутые роли, иначе false.

Обратите внимание, что вы должны использовать тег sec в теге объявления html, как этот

<html xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity4">