Spring SpEL 并将环境属性传递给 SpEL 方法

Spring SpEL and passing env properties to SpEL method

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

我处于 Spring 引导和 Spring 安全环境中,我正在尝试在 @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 方法参数传递?这可能吗?

您可以使用 @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'))")