0

假设 grails (v2.3.x) 自定义类以模仿本文中@JamesWatkins 概述的 java 方式创建和设置,使用静态字符串注释方法很简单:

@Secured(["@mySecurityService.hasPermission('special')"])
public void doSpecialStuff() { ... }

但是为了防止硬编码值,是否可以'special'通过在 SpEL 表达式中嵌入自定义枚举(或类似的)来替换?

我试过这个:

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

1 回答 1

2

首先,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);
        }
    }

}
于 2013-11-12T23:29:48.253 回答