Вопрос по hibernate, spelevaluationexception, spring-3, spring, spring-security – весенняя безопасность: почему мы не можем получить доступ к параметрам полномочий Hibernate в @PreAuthorize?

4

У меня есть следующий метод интерфейса, к которому я применяю@PreAuthorizе:

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

гдеUser этоHibernate entity объект. Это дает мне ошибку:

org.springframework.expression.spel.SpelEvaluationException: EL1007E:(pos 13): Field or property 'id' cannot be found on null at org.springframework.expression.spel.ast.PropertyOrFieldReference.readProperty(PropertyOrFieldReference.java:204)

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

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

Ваш Ответ

4   ответа
1

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

По сути, вы можете использовать аннотацию @P или аннотацию @Param, если вы используете & lt; JDK 8.

Спасибо, добавив@Param аннотация к методу подписи сработала у меня.
0

LazyParamAwareEvaluationContext, внутриloadArgsAsVariables() метод, версия 3.1.0.

Один и тот же ключ для другой сущности из-за реализации интерфейса.

0

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

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

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

И для последнего здесь мы видим, что мы можем повлиять на доступ к id-идентификатору организации (которая является спящим объектом):

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

MethodSecurityEvaluationContextвнутриObject lookupVariable(String name) метод:

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

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

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

и поэтому вы можете видеть, что на самом деле происходит вaddArgumentsAsVariables() Метод как преобразование аргументов метода в переменные SPEL очень четко реализован в Spring.

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

Похожие вопросы