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'))")
我正在尝试使用 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'))")