枚举在SpEL中用于grails spring安全注释?

时间:2013-11-12 22:08:47

标签: grails enums spring-security annotations spring-el

假设以模仿@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

1 个答案:

答案 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);
        }
    }

}