Spring SpEL并将env属性传递给SpEL方法

时间:2017-12-12 01:11:01

标签: spring spring-security spring-el

我正在尝试使用Spring的表达式语言(SpEL)将我的application.yml文件中的属性传递给SpEL方法调用。

我正处于Spring Boot和Spring Security环境中,我正在尝试在@PreAuthorize注释中执行此操作。我可以毫无问题地调用方法hasAuthority()

@PreAuthorize("hasAuthority('APP_USER')")

这很好用。它验证用户是否具有APP_USER授权令牌。但是,我想将此值外部化为配置作为属性。这不起作用:

@PreAuthorize("hasAuthority(#systemProperties.get('app.auth.readToken'))")

我也试过

@PreAuthorize("hasAuthority(#environment( app.auth.readToken ))")

@PreAuthorize("hasAuthority(${app.auth.readToken})")

那么,我如何使用SpEL将应用程序属性作为SpEL方法参数传递?这可能吗?

1 个答案:

答案 0 :(得分:2)

您可以使用PropertyResolver访问注释中的@propertyResolver

@PreAuthorize("hasRole(@propertyResolver.getProperty('app.auth.readToaken'))")

编辑:

如果这不起作用,您可以在配置中提供属性@Bean以加载您的属性。然后只访问该bean而不是propertyResolver。以下是加载yml文件的示例。

@Bean
public Properties properties() {
    YamlPropertiesFactoryBean yaml = new YamlPropertiesFactoryBean();
    yaml.setResources(new ClassPathResource("application.yml"));  //the yml file
    return yaml.getObject();
}

并用于注释...

@PreAuthorize("hasRole(@properties.getProperty('app.auth.readToaken'))")