我正在设置一个 Spring Boot (v1.2.6) Web 项目并使用 Spring Security (v3.2.8)。我找到了 @PreAuthorize
注释非常方便,但我不知道是否有办法从注释中的 SpEL 中读取 Boot 的属性。我正在尝试这样做:
@PreAuthorize("mysecurity.permit")
使用 application.yml 中声明的属性:
mysecurity:
permit: true
但是我得到了
Failed to evaluate expression 'mysecurity.permit'
我也尝试过使用 @mysecurity.permit
和 ${mysecurity.permit}
,结果相同。似乎可以在服务中声明一个方法并以 @service.isMySecurityPermited()
方式访问它,但是我很高兴知道我是否能够直接访问该属性。
最佳答案
注释中使用的值必须是常量。它们在编译时被评估,虽然它们可能被保留以供在运行时使用,但它们不会被重新评估。因此,您可以使用由 SpEL 计算的表达式,或者您可以编写一个在注释值中引用的辅助方法。
如果您查看 OnExpressionCondition 实现,您会注意到它获取传递给注释的值,在您的评论中链接的情况下,它类似于 @ConditionalOnExpression("${server.host== localhost} 或 ${server.port==8080} ")
注解只是获取文本值,它不知道文本代表什么,它只知道它是一个字符串。正是在 OnExpressionCondition 中处理注释值时,String 值才有意义。他们获取 String 值并将其传递给 BeanExpressionResolver 进行解析。
因此,在基于 http://forum.spring.io/forum/spring-projects/security/100708-spel-and-spring-security-3-accessing-bean-reference-in-preauthorize 的 PreAuthorize 解决方案中还将它传递给表达式处理器,您应该能够使用 spring 的表达式语言来引用任何 bean 属性。
我目前无法对其进行测试,但从该线程看来你可以做类似的事情
@Component
public class MyBean {
@Value("${mysecurity.permit}")
private Boolean permit;
public boolean isPermitted() { return permit; }
@PreAuthorize( "@myBean.isPermitted()" )
public blah myMethod() {
// do stuff
}
}
关于@Preauthorize 中的 Spring Boot 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34727061/