Я хочу отображать некоторый контент на основе Роли, используя Spring Security JSP taglibs. Но в Spring Security 3.1.x проверяет только одну роль.
Я могу использовать, но ifAllGranted устарел.
Любая помощь?
Я хочу отображать некоторый контент на основе Роли, используя Spring Security JSP taglibs. Но в Spring Security 3.1.x проверяет только одну роль.
Я могу использовать, но ifAllGranted устарел.
Любая помощь?
В spring безопасности есть специальное выражение безопасности:
hasAnyRole (список ролей) - true, если пользователю предоставлен любой из указанные роли (заданные в виде списка строк, разделенных запятыми).
Я никогда не использовал его, но я думаю, что это именно то, что вы ищете.
Пример использования:
<security:authorize access="hasAnyRole('ADMIN', 'DEVELOPER')">
...
</security:authorize>
Ниже приведена ссылка на справочную документацию, где описаны стандартные выражения безопасности spring. Кроме того, здесь обсуждение, где я описал, как создать пользовательское выражение, если оно вам нужно.
Ответ @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')
.
Использование 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" %>
Я использовал 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>
Вы можете попробовать таким образом, если вы используете тимелина
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">