【问题标题】:How can I use a local variable in the annotation @Preauthorize?如何在注解@Preauthorize 中使用局部变量?
【发布时间】:2017-12-02 00:13:46
【问题描述】:

我需要做这样的事情

String myVar = "myString";
...
@Preauthorize("customMethod(myVar)")
public void myMethod() {
...
}

但我失败了。我怎样才能做到这一点?它说它无法解决

编辑:我正在分离一些休息服务,有时我必须在它们之间共享信息

@Value("${my-properties}")
String urlIWantToShare;
...
@PreAuthorize("isValid(#myValue,urlIWantToShare)")
@RequestMapping(value = "**/letsCheckSecurityConfig", method = RequestMethod.GET)
public boolean letsCheckSecurityConfig(@RequestHeader(name = "MY-VALUE") String myValue)) {
    return true;
}

此“isValid”自定义安全方法将调用外部服务,该服务对调用者及其信息一无所知。我需要传输一些信息,我需要从不同类型的来源获取它们

其中一个来源是我的 application.properties

EDIT2:我设法做到了

@PreAuthorize("isValid(#myValue, #myProperty)")
@RequestMapping(value = "**/letsCheckSecurityConfig", method = RequestMethod.GET)
public boolean letsCheckSecurityConfig(@RequestHeader(name = "MY-VALUE") String myValue,
                                       @Value("${my-property-from-app-properties}") String myProperty))

..但我不仅想使用实际的静态属性,还想使用运行时属性。有什么帮助吗?

【问题讨论】:

  • 你不能。你能描述一下你想要达到的目标吗?或者分享更多代码?

标签: spring spring-security annotations spring-el


【解决方案1】:

您可以创建一个不带参数的包装器方法,该方法将使用参数调用所需的方法。在注解中可以使用不带参数的方法

【讨论】:

  • 你能写一些代码吗?非常感谢
  • 你的 isValid 方法是在哪里定义的?要从注解调用的方法
  • 它保留在一个自定义的 spring-security 类中,该类扩展了 SecurityExpressionRoot 并实现了 MethodSecurityExpressionOperations,正如架构所希望的那样。在这种情况下,它对属性或其他信息不可见。我需要发送的大部分信息都是运行时
【解决方案2】:

抱歉,如果我误解了您要执行的操作,但据我了解,您正在尝试在运行时基于变量/app.properties 设置注释,以便您可以读取此变量,然后执行您的上课?

如果是这种情况,您不能仅从注释中执行此操作,因为注释无法读取局部变量并且无法在运行时设置。

但是,您可以选择一个包含您感兴趣的“值”的对象,然后从该对象中读取值。

类似于以下内容:

PoJo

public class testObject{
    @test
    private String myVar;
    private String myValue;

    //Getters and Setters
}

获取对象值

public void getFields (Object obj){
    Field fields = obj.getClass().getDeclaredFields();

    for (Field f : fields){
        test fieldAnnotation = f.getAnnotation(test.Class);
        if (fieldAnnotation != null){
            f.get(obj);
            // Do checks based on this
        }
    }
}

主类

public static void main(String[] args){
    //Create object
    testObject test = new testObject();

    test.setOne("testOne");
    test.setTwo("testTwo");
    getFields(test);
}

我已经根据获取字段所必须执行的操作提取了此代码 - 但就我而言,我不知道要传递的对象类型。您只是使用注释来“标记”要检索的字段,然后从对象中读取值。

如果你有类似情况,那么你可以在这里看到我的回答:initial answer

如果我误解了这一点,请告诉我,我可以尝试进一步澄清我的答案。

【讨论】:

  • 您好阿米特,感谢您的时间和回答。首先,我想要实现的是服务解耦。架构本身是无状态的,这个场景中的微服务互不认识。有一个特定的微服务正在处理安全性并且进入春天我做了一些自定义方法来保护我的端点。我的需要是显示 url 和相互引用并保持在 spring 架构中(因此需要在注释中使用 @Preauthorize 和 vars)。实际上 EDIT2 部分运行良好
猜你喜欢
  • 2023-03-20
  • 2013-07-22
  • 1970-01-01
  • 2012-12-16
  • 2016-07-29
  • 1970-01-01
  • 1970-01-01
  • 2018-06-19
  • 1970-01-01
相关资源
最近更新 更多