Установка пользовательских ролей в зависимости от формы собственности в Spring Security - PullRequest
8 голосов
/ 29 февраля 2012

В моем приложении на базе Spring в настоящее время у меня есть основные роли, такие как ADMIN и USER.

Можно ли определить роль пользователя, такую ​​как PHOTO_UPLOADER, которая наследуется от пользователя USER, но также добавляет проверку, действительно ли пользователь, выполняющий вызов, является владельцем фотографии?

Я устал писать одно и то же if (currentUser.id == photo.uploader.id) в действиях моего контроллера снова и снова. Это относится и к другим юридическим лицам.

Ответы [ 3 ]

11 голосов
/ 29 февраля 2012

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

1 голос
/ 03 марта 2012

Я не знаю, какие типы технологий доступа к данным вы используете.я знаю, что вы можете написать перехватчик или прослушиватель событий для проверки безопасности для спящего режима.я думаю, что ибатис тоже так.В моем проекте я написал методы интерфейса CRUD enable в родительском классе модель / сущность и проверял безопасность в некоторых событиях, например, перед загрузкой сущности.весенняя безопасность acl немного сложна.Внедрение вашего решения по безопасности лучше

0 голосов
/ 29 февраля 2012

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

...