我想知道为什么spring不直接计算所有表达式,因为它们是从属性文件注入到@PreAuthorize(…)
注释。我认为spring不会计算一些字符,比如“(”、“)”、“”,等等,或者它会在属性文件中注入的值之上添加特殊字符。为了澄清,让我们考虑下面的例子。
@PreAuthorize("hasRole('ROLE_ADMIN')")
上述表达式是正常的,工作正常。假设属性文件的值如下所示。
role1=ROLE_ADMIN
role2='ROLE_ADMIN'
role3=hasRole('ROLE_ADMIN')
>
让我们从属性文件中注入
role1
,并将其传递给@PreAuthorize(“hasRole(${role1})”)
,它可以正常工作。以正常方式计算hasRole(…)
表达式,角色名称必须在单引号下,即,
'role\u ADMIN'
。但在这里,它与角色_ADMIN一起工作。令人惊讶的
如果我们将属性文件中的
role2
注入@PreAuthorize(“hasRole(${role2})”)
,它将返回拒绝访问。这意味着它是经过计算的,但我们可以意识到传递给表达式的值不是“'ROLE\u ADMIN'
”的值。因此,如果角色名称位于单引号下,则访问被拒绝。又是一个惊喜!。
如果我们试图将属性文件中的
role3
注入到@PreAuthorize(${role3}”)
,则也不会对其进行评估。例外情况:
java。lang.IllegalArgumentException:无法计算表达式“role3”
,根本原因为:
org。springframework。表示斯佩尔。SpelEvaluationException:EL1001E:(位置0):类型转换问题,无法从java转换。字符串转换为java。lang.Boolean
java。lang.IllegalArgumentException:无效的布尔值“hasRole('ROLE_ADMIN')”
我的结论是:
从上面的(1)和(2)中,我们可以意识到一件事。也就是说,在传递给
@PreAuthorize(…)时,注入的值似乎放在单引号(“”)下
注释。如果这句话不正确,(1)和(2)就行不通了。这只是我的结论!。
当我们谈到(3)时,情况似乎与(1)和(2)相似。文件中的值为
hasRole('ROLE_ADMIN')
。正确注入此值后,如果在传递到@PreAuthorize(...)
时添加单引号,则会像@PreAuthorize('hasRole('ROLE_ADMIN')'")
。所以'hasRole('ROLE_ADMIN')'
是一个字符串,而不是布尔值。只是我的嫌疑犯。
问题:
你认为我的结论正确吗?如果没有,你能指出我是否错过了什么吗?或者提供我,如果你有其他的解决方案来实现
@PreAuthorize(...)
从属性文件注入值。
提前谢谢你!
注意
:这既不是配置问题,也不是注入问题。我检查了值是否正确注入。
答案的关键是如何在SpEL中表示字符串文字。以下各项有效:
'Hello'
是SpEL String文字。HELLO
,您将收到一个"HELLO"
字符串文本。HELLO
,您将收到一个'HELLO'
字符串文本。现在让我们看看上面的例子。
>
在第二种情况下,资源包中有role2='ROLE\u ADMIN'
,这意味着在计算${role2}
时将创建''ROLE\u ADMIN'
字符串文本。请注意,'
符号通过放置两个'
字符进行转义。您收到一个拒绝访问错误,原因很简单,因为您没有'ROLE\u ADMIN'
角色,但是ROLE\u ADMIN
(这是不同的)。
你的第三个猜测几乎是正确的。唯一不正确的是注释在计算资源包中的#{角色3}
值后的样子。正如我所提到的,在SpEL中通过放置两个'
字符来转义'
。因此,注释看起来像@PreAuthorize('hasRole('ROLE_ADMIN''')'")
。您完全正确地假设这是一个String
,而不是一个Boolean
表达式,这就是为什么抛出IllegalArgumentExc0019
。
主要内容:示例,SpEL对Bean定义的支持,SpEL中的运算符,SpEL中的变量Spring Expression Language(简称 SpEL)是一种功能强大的表达式语言,支持运行时查询和操作对象图 。表达式语言一般是用最简单的形式完成最主要的工作,以此减少工作量。 Java 有许多可用的表达式语言,例如 JSP EL,OGNL,MVEL 和 JBoss EL,SpEL 语法类似于 JSP EL,功能类似于 Struts2 中的 OGNL,能在运行时构建复杂表达式、存取
问题内容: 我正在尝试使用SpEL根据我定义的一些规则将同一文档加载到不同的集合中。 因此,从我所拥有的开始: -首先文件: -秒我有应该提供集合名称的提供者bean: 问题是,当我尝试将文档插入应由提供程序生成的特定集合中时,我得到以下stacktrace: org.springframework.expression.spel.SpelEvaluationException:EL1057E :
是否可以在@cacheable注释的除非表达式中使用spring属性占位符?我希望缓存一个服务方法,除非返回的结果小于@PropertySource(“classpath:application.properties”)中指定的属性minCacheCalc的值。
问题内容: 有没有办法让AngularJS在模型数据中评估表达式? HTML: 模型: 最终结果将是:。 问题答案: 您可以使用该服务来插值字符串… JSFiddle
问题内容: 我有以下代码片段: 我知道在C ++中,您被教导不要依赖子表达式的求值顺序,因为它不能保证完全是任何顺序。因此,此代码将是错误的,并且不能保证条件中表达式所产生的布尔值是真实的(例如,可以在第一次等式测试中对y进行递增运算)。由于我是在Java认证书中阅读此代码的,因此我认为Java并非如此。.我的意思是,我是否保证Java的评估顺序始终是从左到右?因此,以上表达式应始终为true。
我有以下代码片段: 我知道在C++中,你被教导不要依赖子表达式的求值顺序,因为它不能保证是任何顺序。因此这段代码是错误的,并且条件中的表达式所产生的布尔值不能保证为真(例如,在第一个相等性测试中计算y之前,可以增加y)。因为我是在Java认证书上读到这段代码的,所以我假设Java不是这样的。我的意思是,我能保证Java的计算顺序总是从左到右吗?所以上面的表达式应该总是产生true。