当前位置: 首页 > 知识库问答 >
问题:

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

都超英
2023-03-14

我试图使用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个答案

张逸清
2023-03-14

您可以使用@Properties tyResolver访问批注中的Properties tyResolver

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

如果这不起作用,可以在配置中提供属性@Bean来加载属性。然后只需访问该bean,而不是属性Resolver。下面是加载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'))")
 类似资料:
  • 问题内容: 如何将主机环境变量(例如用户名和主机名)传递给dockerfile? 例如,如果我的用户名是: 如何编写Docker文件以获得相同的输出? 问题答案: 我遇到了同样的问题。我的解决方案是在docker-compose.yml内部提供变量,因为yml支持使用环境变量。 我认为这对我来说是最有效的方式,因为我不喜欢在命令行中使用类似以下内容一遍又一遍地键入它 在容器中,声明将无效,将设置为

  • 我正在使用GAE部署我的应用程序,我想把一些环境变量传递给我的GAE实例。例如,每次我使用DB时,分配当前是这样的: 这很好,但问题是它是一个共享代码,每次有人进行本地测试时,它都会更改路径,并将更改推送到存储库。当有人拉动新的更改时,它需要更改以发出db请求,因为每个人都有不同的套接字更改路径。因此,我创建了以下声明: 因此,如果某个人的系统中有一个环境变量,那么它会接受该变量并避免绝对路径。问

  • 我正在使用gradle tooling api,我遇到了下面的场景。有一个应用某个插件P的项目,它只在传递shouldApplyP属性时才创建任务T。 因此,如果您将运行,您将看不到任务T,但是如果您将运行,您将看到任务T。 在gradle tooling api中,一旦创建了,我就可以执行 但我看不到这个具体的任务。是否有方法将此属性传递给项目连接,以便在方法中显示该属性?

  • 问题内容: 在我的HTML文件中,我已通过以下方式链接到JS: 我的JS可以像这样直接读取此var的值吗? 这不起作用,并且FireFox错误控制台显示“未定义配置”。如何读取JS文件中通过src属性传递的var?这样简单吗? 问题答案: 您无法按照尝试的方式将变量传递给JS。SCRIPT标记不会创建Window对象(具有查询字符串),并且它不是服务器端代码。

  • 假设我有一个带有属性的注释: 我想创建一个包含多个元注释的复合注释,包括一个带有属性的注释 有没有一种方法可以将复合注释的属性传递给其中一个元注释? 例如,类似这样的东西: 这相当于,但比 谢谢! PS为我对示例注释的错误选择表示歉意-我没有javax。注射@记住命名注释,只是一些具有属性的任意注释。 谢谢大家的回答/评论。 这显然是不可能的。然而,碰巧我的案例有一个简单的解决方法,我将与大家分享

  • 问题内容: 我有一个属性指令,其限制如下: 我需要传递两个属性;一个数字和一个函数/回调,使用对象在指令中访问它们。 如果指令是元素指令,那么我可以限制为: 但是,出于某种原因,我不再赘述,我需要将该指令作为属性指令。 如何将多个属性传递到属性指令中? 问题答案: 该指令可以访问在同一元素上定义的任何属性,即使该指令本身不是该元素也是如此。 模板: 指示: 如果attribute的值将被硬编码,则