假设以模仿@JamesWatkins in this post概述的java方式的方式创建和设置grails(v2.3.x)自定义类,使用静态字符串注释方法很简单:
@Secured(["@mySecurityService.hasPermission('special')"])
public void doSpecialStuff() { ... }
但是为了防止硬编码值,是否可以通过在SpEL表达式中嵌入自定义枚举(或类似)来替换'special'
?
我试过这个:
@Secured(["@mySecurityService.hasPermission('{ T(com.example.MyConfig$MyEnum.SPECIAL) }')"])
public void doSpecialStuff() { ... }
但我不断得到一个关于字符串不是常数的例外:
Expected '@mySecurityService.hasPermission('{ T(com.example.MyConfig$MyEnum.SPECIAL) }')' to be an inline constant of type java.lang.String
答案 0 :(得分:1)
首先,SpEL语法错误。移除'
并将.SPECIAL
移到T(...)
之外。
此外,@Secured
不支持SpEL - 如其他帖子所示,您必须使用@PreAuthorize
。
我刚写了一个快速测试用例,这很好用......
public class TestHandler implements MessageHandler {
public List<Message<?>> sentMessages = new ArrayList<Message<?>>();
@Override
@PreAuthorize("@myAuth.hasPermission(T(foo.TestHandler$MyEnum).FOO.toString())")
public void handleMessage(Message<?> message) {
sentMessages.add(message);
}
public enum MyEnum {
FOO("foo");
private final String value;
private MyEnum(String value) {
this.value = value;
}
@Override
public String toString() {
return value;
}
}
public static class MyAuth {
public boolean hasPermission(String foo) {
return "foo".equals(foo);
}
}
}