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')",我觉得它运行得很好。 因为我其中一个用户既是admin又是user。 为此,您需要添加use-expressions="true" auto-config="true",后跟http标记
5条答案
按热度按时间hsgswve41#
Spring 安全有一个特殊的安全表达:
我从来没有用过它,但我认为它正是你要找的。
示例用法:
这里是一个link to the reference documentation,其中描述了标准的spring安全表达式。另外,这里是一个讨论,我描述了如何创建自定义表达式,如果你需要它。
h79rfbju2#
迪马斯的回答与你的问题在逻辑上并不一致;
ifAllGranted
不能直接替换为hasAnyRole
。从Spring Security 3-〉4迁移指南:
旧版:
新产品(SPeL):
用
hasAnyRole
直接替换ifAllGranted
将导致spring使用OR
而不是AND
来计算语句。也就是说,如果经过身份验证的主体包含 * 至少一个 * 指定角色,hasAnyRole
将返回true
。而Spring的ifAllGranted
方法(在Spring Security 4中已弃用)仅在经过身份验证的主体包含 * 所有 * 指定角色的情况下才返回true
。TL;DR:要使用Spring Security Taglib的新身份验证表达式语言复制
ifAllGranted
的行为,需要使用hasRole('ROLE_1') and hasRole('ROLE_2')
模式。ippsafx73#
我使用了
hasAnyRole('ROLE_ADMIN','ROLE_USER')
,但我在下面得到bean创建错误然后我试着
access="hasRole('ROLE_ADMIN') or hasRole('ROLE_USER')"
,我觉得它运行得很好。因为我其中一个用户既是admin又是user。
为此,您需要添加
use-expressions="true" auto-config="true"
,后跟http标记p5cysglq4#
在Sping Boot 2.4中,
请确保您已
百里香叶-附加- spring security 5
的名称空间。同时请确定您包含
在您的html中...
pu82cl6c5#
如果你用的是thymeleaf,你可以这样试
如果经过身份验证的主体至少包含一个指定角色,则hasAnyRole将返回true,否则返回false。
请注意,您必须在html声明标记中使用sec标记,如下所示