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

时间:2017-06-28 14:43:24

标签: spring spring-security annotations spring-el

我需要做这样的事情

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

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

如果我误解了你想要做的事情,请道歉,但根据我的理解,你试图在运行时根据变量/ 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

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