Spring аннотации безопасности с EL - требует отладочную информацию, скомпилированную в? - PullRequest
6 голосов
/ 25 мая 2010

Я рассматриваю возможность использования аннотаций Spring Security для своего приложения с функцией EL (язык выражений). Например:

@PreAuthorize("hasPermission(#contact, 'admin')")
public void deletePermission(Contact contact, Sid recipient, Permission permission);

Мне нужна возможность EL, потому что я создал свою собственную реализацию ACL. Однако, чтобы использовать эту возможность с аргументами типа "#contact", в документации Spring сказано следующее:

Вы можете получить доступ к любому из методов аргументы по имени как выражение переменные, если ваш код имеет отладочная информация, скомпилированная в.

Напрашивается два вопроса:

  1. Допустимо иметь промышленное применение распространяется с отладочной информацией в нем?
  2. Если нет, есть ли способ обойти это?

Спасибо за любые указания по этому вопросу!

Ответы [ 3 ]

9 голосов
/ 25 мая 2010

В качестве обходного пути вы можете реализовать пользовательский ParameterNameDiscoverer с вашей собственной стратегией. Вот пример, который производит простые пронумерованные имена (arg0 и т. Д.):

public class SimpleParameterNameDiscoverer implements
        ParameterNameDiscoverer {

    public String[] getParameterNames(Method m) {
        return  getParameterNames(m.getParameterTypes().length);        
    }

    public String[] getParameterNames(Constructor c) {
        return getParameterNames(c.getParameterTypes().length);        
    }

    protected String[] getParameterNames(int length) {
        String[] names = new String[length];

        for (int i = 0; i < length; i++)
            names[i] = "arg" + i;

        return names;
    }
}

И конфигурация:

<global-method-security ...>
    <expression-handler ref = "methodSecurityExpressionHandler" />
</global-method-security>

<beans:bean id = "methodSecurityExpressionHandler" 
    class = "org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler">
    <beans:property name = "parameterNameDiscoverer">
        <beans:bean class = "foo.bar.SimpleParameterNameDiscoverer" />
    </beans:property>
</beans:bean>
2 голосов
/ 28 сентября 2015

Полагаю, это не было вариантом, когда вы впервые подошли к проблеме, но теперь вы можете сделать это

@PreAuthorize("hasPermission(#contact, 'admin')")
public void deletePermission(@P("contact") Contact contact, Sid recipient, Permission permission);

http://docs.spring.io/spring-security/site/docs/current/reference/html/el-access.html#access-control-using-preauthorize-and-postauthorize

1 голос
/ 13 марта 2014

Сейчас я не могу найти ссылку, но вам может быть интересно знать, что Java 8 будет всегда включать имена параметров, даже когда я верю, что Java 8 будет всегда включать имена параметров, даже в режиме отладки.

...