Установка пользовательских ролей на основе какого-либо владения в 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 немного сложна. Реализация вашего решения безопасности лучше

Добро пожаловать в мир ACL - список контроля доступа. Этот урок довольно старый, но довольно полный.

Другие вопросы по тегам