Spring Security @方法级别的PreAuthorize-如何将类级别变量注入自定义PreAuthorize方法参数

wlwcrazw  于 2023-02-16  发布在  Spring
关注(0)|答案(2)|浏览(318)

这是我的代码看起来像:

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的参数,那么它工作正常。但同时我面临着一个问题,如“无法找到占位符资源.clientId”,由于保管库APPROLE令牌到期。
因此决定将方法arg更改为类级变量,就像上面一样。但是这个@PreAuthorize [@PreAuthorize(“isClient(#clientId)”)]逻辑没有选择客户端ID。有人能分享一个合适的方法来解决这个问题吗?我需要使用哪个表达式来解决这个问题?

mwg9r5ms

mwg9r5ms1#

最后,我找到了一个解决方案来做到这一点-我不确定有没有比这更好的解决方案。

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自定义方法。我希望,这对其他人也有帮助。

nbysray5

nbysray52#

另一个答案是创建一个@Component,如本期所述:
https://stackoverflow.com/a/61080418/2489730

@Component("Roles")
public final class RoleContainer {
  public static final String Admin = "Admin";
}
@PreAuthorize("hasRole(@Roles.Admin)")

相关问题