Spring 如何在注释@Preauthorize中使用局部变量?

Spring 如何在注释@Preauthorize中使用局部变量?,spring,spring-security,annotations,spring-el,Spring,Spring Security,Annotations,Spring El,我需要这样做 String myVar = "myString"; ... @Preauthorize("customMethod(myVar)") public void myMethod() { ... } 但我在这方面失败了。我该怎么做?它说这个问题无法解决 编辑:我很少使用rest服务,有时我不得不在它们之间共享信息 @Value("${my-properties}") String urlIWantToShare; ... @PreAuthorize("isValid(#myValu

我需要这样做

String myVar = "myString";
...
@Preauthorize("customMethod(myVar)")
public void myMethod() {
...
}
但我在这方面失败了。我该怎么做?它说这个问题无法解决

编辑:我很少使用rest服务,有时我不得不在它们之间共享信息

@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))

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

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

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

如果我误解了您的意图,请道歉,但据我所知,您试图在运行时基于变量/app.properties设置注释,以便您可以读取此变量,然后执行类

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

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

如下所示:

PoJo

获取对象值

主类

我根据获取字段所必须做的事情来提取这段代码——但在我的例子中,我不知道要传递的对象类型。您只需使用注释“标记”要检索的字段,然后从对象读取值

如果你处于类似的情况,那么你可以在这里看到我的答案:


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

如果我误解了您的意图,请道歉,但据我所知,您试图在运行时基于变量/app.properties设置注释,以便您可以读取此变量,然后执行类

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

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

如下所示:

PoJo

获取对象值

主类

我根据获取字段所必须做的事情来提取这段代码——但在我的例子中,我不知道要传递的对象类型。您只需使用注释“标记”要检索的字段,然后从对象读取值

如果你处于类似的情况,那么你可以在这里看到我的答案:


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

你不能。你能描述一下你想要达到的目标吗?或者分享更多的代码?你不能。你能描述一下你想要达到的目标吗?或者可以分享更多的代码?你能写一些代码吗?感谢lot在哪里定义了您的isValid方法?您希望从annotationIt调用的方法保留在自定义spring安全类中,该类扩展SecurityExpressionRoot并实现MethodSecurityExpressionOperations,如体系结构所愿。在这种情况下,它对属性或其他信息没有可见性。我需要发送的大多数信息都是运行时的,你能写一些代码吗?感谢lot在哪里定义了您的isValid方法?您希望从annotationIt调用的方法保留在自定义spring安全类中,该类扩展SecurityExpressionRoot并实现MethodSecurityExpressionOperations,如体系结构所愿。在这种情况下,它对属性或其他信息没有可见性。我需要发送的大多数信息都是runtimeHello Amit,谢谢您的时间和回复。首先,我试图实现的是服务解耦。该体系结构本身是无状态的,并且该场景中的微服务彼此不了解。有一个特定的微服务正在处理安全性问题,在spring中,我几乎没有自定义方法来保护我的端点。我的需要是显示彼此的URL和引用,并保持在spring体系结构中(因此需要在注释中使用@Preauthorize和vars)。实际上EDIT2部分很好,你好,阿米特,谢谢你的时间和回答。首先,我试图实现的是服务解耦。该体系结构本身是无状态的,并且该场景中的微服务彼此不了解。有一个特定的微服务正在处理安全性问题,在spring中,我几乎没有自定义方法来保护我的端点。我的需要是显示彼此的URL和引用,并保持在spring体系结构中(因此需要在注释中使用@Preauthorize和vars)。实际上,EDIT2部分工作得很好
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);
}