【问题标题】:@PreAuthorize in method level - how to inject a class level variable into custom PreAuthorize method argument方法级别的@PreAuthorize - 如何将类级别变量注入自定义 PreAuthorize 方法参数
【发布时间】:2020-05-21 09:58:56
【问题描述】:

我的代码如下:

public class MyController {

@Value("${resource.clientId}") // this value is retreiving from vault
private String clientId;

 @PreAuthorize("isClient(#clientId)") //isClient a custom security method
 public String Mymethod(Authentication authentication){

 }
}

如果我使用 clientId 作为 Mymethod 的参数,那么它工作正常。但与此同时,由于保险库 APPROLE 令牌到期,我面临着“找不到占位符 resource.clientId”之类的问题。

因此决定将方法 arg 更改为上面的类级别变量。但是这个@PreAuthorize [@PreAuthorize("isClient(#clientId)")] 逻辑没有选择clientid。 谁能分享一个合适的方法来解决这个问题?我需要在这里使用哪个表达式来解决这个问题?

【问题讨论】:

  • 让我检查一下我是否理解正确:你想让 Spring EL 评估静态变量吗?
  • @DanielJacob - 我想将 clientId(来自类级别变量)值作为 isClient() 自定义安全方法的参数传递。没有任何问题的最佳方法是什么(使用表达式或任何其他方式)。我尝试了不同的方法来解决 NullPointer / failed expression 类型的问题。
  • @DanielJacob - “让我检查一下我是否理解正确:您希望 Spring EL 评估静态变量” - 如果这解决了我的问题,请分享表达式。 - 谢谢
  • 是实例变量还是静态变量?
  • @Daiel Jacob - 我可以使用实例变量吗,目前我使用的是静态变量(如答案部分所述),但由于静态变量应该是私有的和最终的,因此出现声纳问题。如果我设置私有,clientid 不会获取并抛出失败的评估表达式。

标签: spring spring-security


【解决方案1】:

最后,我找到了一个解决方案——我不确定是否有比这更好的解决方案。

public class MyController {

  public static String CLIENT_ID;

  @Value("${resource.clientId}") // this value is retrieving from vault
  public void setClientId(String clientId) {
      CLIENT_ID = clientId;
  }

  @PreAuthorize("isClient({T(com.test.MyController).CLIENT_ID})") //isClient a custom security method
  public String Mymethod(Authentication authentication){

  }

}

使用非静态方法将保险库值注入静态变量,最后将该静态变量传递给@PreAuthorize 自定义方法。我希望,这对其他人也有帮助..

【讨论】:

    猜你喜欢
    • 2011-11-29
    • 2016-06-30
    • 2014-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-26
    • 1970-01-01
    • 2023-03-26
    相关资源
    最近更新 更多