Spring security 3.2 - выражения @PostAuthorize для оценки принципала по сравнению с возвращаемым объектом метода

Я использую Spring Security для защиты и оценки выражения в аннотациях @PostAuthorize и @PreAuthorize для авторизации методов службы. У меня есть требование, которое нужно проверить, имеет ли возвращаемый объект тот же идентификатор пользователя, который вошел в систему и вызывает этот метод.

// this allows the ids of other users too
@PostAuthorize("returnObject!=null?returnObject.userId==principal.account.acid:true")
public AudioClip findAudioClip(int clipId) {
     .....
     AudioClip clip = dao.findById(clipId);
     // may also be null
     return clip;
}

Аудиоклип.java

@Component
public class AudioClip implements java.io.Serializable {

private java.math.BigDecimal id;
private java.lang.Integer    userId;
.....
}

Извлеченный объект из базы данных содержит идентификатор пользователя, который создал этот объект базы данных. Таким образом, только он имеет право доступа к этому компоненту. Как сравнить returnObject.userId с идентификатором пользователя, вошедшего в систему?


person Vijay Veeraraghavan    schedule 20.08.2014    source источник
comment
ага, исправлю   -  person Vijay Veeraraghavan    schedule 20.08.2014
comment
Просто чтобы убедиться, что ваша аннотация PostAuthorize, хотя и выглядит нормально, ничего не блокирует, верно? Если это так, не могли бы вы попробовать добавить @PreAuthorize("denyAll") и если он правильно блокирует @PreAuthorize("hasRole('ROLE_CAESAR_IMPERATOR')") (при условии, что у вас нет такой роли) и сказать, что произойдет?   -  person Serge Ballesta    schedule 20.08.2014
comment
Отредактировав исходный вопрос, чтобы опубликовать правильный ответ, это сбивает с толку. Вы избавились от #, который был проблемой и почему он был опубликован в первую очередь. Мне потребовалось некоторое время, чтобы понять, в чем из-за этого разница в проблеме и решении.   -  person Jeff Treuting    schedule 26.07.2017


Ответы (2)


@holmis, как вы указали, виновником является # в коде! этот код

@PostAuthorize("returnObject!=null?returnObject.userId==principal.account.aid:true")

работает!

person Vijay Veeraraghavan    schedule 20.08.2014
comment
Я бы также рекомендовал вместо проверки null внутри @PostAuthorize сделать это в методе и выкинуть там какую-то ошибку NOT FOUND, таким образом вы пропустите проверку @PostAuthorize для пустых объектов - person amstegraf; 04.08.2020

то же самое, но я считаю, что это читается лучше, чем ответ @vijay.

@PostAuthorize("returnObject == null ?: returnObject.userId == principal.account.aid")

см. 6.5.14 Оператор Элвиса

person denov    schedule 30.10.2020