4

У меня есть следующий метод интерфейса, на котором я подаю @PreAuthoriz е:Весенняя безопасность: Почему мы не можем получить доступ к параметрам Enable Hibernate в @PreAuthorize?

@PreAuthorize("doSomething(#user.id)") 
void something(User user, List<User> accessList); 

где User является Hibernate объекта объекта. Это дает мне ошибку:

org.springframework.expression.spel.SpelEvaluationException: EL1007E: (поз 13): Поле или свойство 'идентификатор' не может быть найден на нуль при org.springframework.expression.spel .ast.PropertyOrFieldReference.readProperty (PropertyOrFieldReference.java:204)

Там нет никакого способа, что параметр user имеет нулевое значение, как если бы я удалить аннотацию, и проверить значение пользователя в способе, который реализует этот интерфейс метод, существует действующий объект User. Кроме того, перед вызовом этого метода я убедился, что пользовательский объект правильно построен.

Я действительно не могу понять, почему бы user поле считается утратившим анализатором SPEL

ответ

2

Вы можете проверить с помощью отладчика, что происходит в MethodSecurityEvaluationContext, внутри Object lookupVariable (имя String) метод:

@Override 
    public Object lookupVariable(String name) { 
    Object variable = super.lookupVariable(name); 

    if (variable != null) { 
     return variable; 
    } 

    if (!argumentsAdded) { 
     addArgumentsAsVariables(); 
     argumentsAdded = true; 
    } 

и поэтому вы можете увидеть, что происходит на самом деле в addArgumentsAsVariables() метод как Перекодировка метода argume nts для переменных SPEL очень четко реализуется весной.

+1

Спасибо за что .. Как оказалось, имя переменной в аргументе метода в объявлении интерфейса отличается от имени в моей фактической реализации метода ...Весна искала последнее имя – Daud

0

Вы можете проверить LazyParamAwareEvaluationContext, внутри loadArgsAsVariables() метод, версия 3.1.0.

Тот же ключ для разных сущностей, из-за реализации интерфейса.

1

Spring Security имеет лучший ответ на эту проблему сейчас:

http://docs.spring.io/spring-security/site/docs/3.2.5.RELEASE/reference/htmlsingle/#access-control-using-preauthorize-and-postauthorize

В принципе, вы можете использовать @p аннотацию или @param аннотацию, если вы используете < JDK 8.

+0

Спасибо, добавив к мне подпись метода @ @ Param. –

0

I нужно добавить что-то к этому, поскольку заголовок указывает, что мы не можем получить доступ к свойствам спящего режима.

Существует два выпуска hasPermission, загруженного объекта и сериализованного объекта. Вот код из теста:

@PreAuthorize("isAuthenticated() and hasPermission(#organization, 'edit')") 
public long protectedMethod(Organization organization) 
{ 
    return organization.getId(); 
} 

И для последних здесь мы видим, что мы можем Infact доступ Ид proprty организации (которая является зимуют юридическое лицо):

@PreAuthorize("isAuthenticated() and hasPermission(#organization.getId(), 'organization', 'edit')") 
public long protectedMethodSerializableEdtion(Organization organization) 
{ 
    return organization.getId(); 
}