Установка пользовательских ролей на основе какого-либо владения в Spring Security
В моем приложении на базе Spring в настоящее время у меня есть основные роли, такие как ADMIN и USER.
Можно ли определить роль пользователя, такую как PHOTO_UPLOADER, которая наследуется от пользователя USER, но также добавляет проверку, действительно ли пользователь, выполняющий вызов, является владельцем фотографии?
Я устал писать то же самое if (currentUser.id == photo.uploader.id)
в моем контроллере действия снова и снова. Это относится и к другим юридическим лицам.
3 ответа
Вы можете справиться с этими ACL, как предложил Томаш Нуркевич. Но ACL Spring Securitz сложны и плохо документированы. (Лучший ресурс, который я знаю, это книга " Spring Security 3" - авторы Spring Security)
Но если вам действительно нужно только это простое if (currentUser.id == photo.uploader.id)
тест, то я бы порекомендовал другой метод.
Можно улучшить выражения безопасности метода, используя их в аннотациях @PreAuthorize. Подобно:
@PreAuthorize("isPhotoOwner(#photo)")
public void doSomething(final Photo photo) {
Для реализации такого выражения isPhotoOwner
ядро действительно простое:
public class ExtendedMethodSecurityExpressionRoot extends MethodSecurityExpressionRoot {
public ExtendedMethodSecurityExpressionRoot(final Authentication a) {
super(a);
}
/**
*
*/
public boolean isPhotoOwner(final Photo photoObject) {
if (photoObject == null) {
return false;
}
Photo photo = (photo) photoObject;
return photo.getCreator().getLogin().equals(authentication.getName());
}
}
К сожалению, для регистрации ExtendedMethodSecurityExpressionRoot требуется дополнительная работа. --- У меня нет времени на данный момент, если вы готовы попробовать этот подход, то оставьте комментарий, а я опишу остальное
Я не знаю, какие технологии доступа к данным вы используете. я знаю, что вы можете написать перехватчик или прослушиватель событий для проверки безопасности на спящий режим. Я думаю, что ибатис тоже так. В моем проекте я написал методы интерфейса CRUD enable в родительском классе модели / сущности и выполнял проверку безопасности в некоторых событиях, например, перед загрузкой сущности. Весенняя безопасность acl немного сложна. Реализация вашего решения безопасности лучше