Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Java Новый топик    Ответить
 Проверка наличия права пользователя выполнить данный метод  [new]
Nixic
Member

Откуда: Perm
Сообщений: 1886
Всем, привет!
Ни разу не реализовывал подобного, решил сначала спросить.

Есть User, к нему привязаны некие права, например "SAVE_ITEM"
Есть в сервисе метод.
public itemDTO save(itemDto) {
    return repository.save(itemDto);
}

Ну и соответственно, если у юзера нет такого права в списке, то выдавать ошибку (какую именно, пока не важно).
И главное: проверка наличия права на сохранение конкретного item зависит от самого item,
а конкретнее - если item есть в той же группе, что и пользователь.
То есть нужно зайти в метод, и проверить право через сам item и затем "отшить" или выполнить сохранение.

Предполагаю, что можно через аннотации такое реализовать как-то можно. По крайней мере, это было бы красиво :)
Или делать через... какой-нибудь enum и отдельные методы проверки внутри каждого метода?

В общем буду рад любым теоретическим вариантам и еще больше кускам кода :)
Спасибо.
10 сен 19, 17:53    [21968010]     Ответить | Цитировать Сообщить модератору
 Re: Проверка наличия права пользователя выполнить данный метод  [new]
Nixic
Member

Откуда: Perm
Сообщений: 1886
упс, вот так правильно))
public ItemDTO save(ItemDto itemDto) {
    return repository.save(itemDto);
}

п.с. repository здесь - это JPA репозиторий, инжектится через @Autowired
10 сен 19, 17:57    [21968011]     Ответить | Цитировать Сообщить модератору
 Re: Проверка наличия права пользователя выполнить данный метод  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 2042
Nixic,
Это право уже не на метод как в теме озаглавлено.
Ну и права то где у тебя? В какой либе?
10 сен 19, 17:59    [21968014]     Ответить | Цитировать Сообщить модератору
 Re: Проверка наличия права пользователя выполнить данный метод  [new]
chpasha
Member

Откуда:
Сообщений: 8426
@PreAuthorize("@mysecurity.canDeleteRawData(#records)")
public void deleteData(Collection<Recordset> records) {

}

...


@Component("mySecurity")
public class MySecurity {

    @PreAuthorize("hasRole(T(my.sample.Roles).POWER_USER)")
    public boolean canDeleteRawData(Collection<RawRecordset> records) {
        //дополнительная логика по проверке
    }

}


идея понятна?
10 сен 19, 18:06    [21968019]     Ответить | Цитировать Сообщить модератору
 Re: Проверка наличия права пользователя выполнить данный метод  [new]
Nixic
Member

Откуда: Perm
Сообщений: 1886
PetroNotC Sharp
Nixic,
Это право уже не на метод как в теме озаглавлено.
Ну и права то где у тебя? В какой либе?

Согласен, право на объект itemDTO, действия над ним, то есть на выполнение метода :)
Права в виде обычного List<String> прикрепляются в методе проверки в который передается авторизованный юзер и объект.
Там проверяется есть у них общая группа, т.е. состоят ли они, добавлены ли в общую группу.
10 сен 19, 18:10    [21968026]     Ответить | Цитировать Сообщить модератору
 Re: Проверка наличия права пользователя выполнить данный метод  [new]
Nixic
Member

Откуда: Perm
Сообщений: 1886
chpasha, почти понятна, главное, что через аннотации, как я и хотел это вполне реально, спасибо!
Попробую реализовать, если будут затыки, отпишусь. Ну и если сделаю - тоже.
10 сен 19, 18:13    [21968030]     Ответить | Цитировать Сообщить модератору
 Re: Проверка наличия права пользователя выполнить данный метод  [new]
Nixic
Member

Откуда: Perm
Сообщений: 1886
chpasha, Спасибо большое! :)
Заюзал идею примерно так:
1. Все права закинул в отдельный enum.
2. В контроллере (тут еще от swagger'a всякое, пусть тоже тут будет):

    @ApiOperation(value = "Метод удаляет пользователей по списку id через запятую")
    @RequestMapping(value = "", method = RequestMethod.DELETE)
    public List<DtoResponseDeleteStatus> deleteUserById(@ApiParam(value = "ids")
                                                            @RequestParam(value = "ids", required = true) String ids) {
        List<UserPermission> requiredPermissions = Arrays.asList(REMOVE_USER);
        return service.deleteUsers(ids, requiredPermissions);
    }

добавили в параметры метода requiredPermissions

3. В сервисе метод переписал так:
    @Override
    @Transactional
    @PreAuthorize("@permissionSecurity.checkUserControllerPermission(#requiredPermissions)")
    public List<DtoResponseDeleteStatus> deleteUsers(String requestIds, List<UserPermission> requiredPermissions) {
...
}

4. В компоненте permissionSecurity
@Component("permissionSecurity")
public class PermissionSecurity {
...
}

пришлось создать уже(пока) парочку методов для разных проверок, где-то с проверкой прав на объект у контретного юзера с предварительной проверкой "а не админ ли ты часом?".

Ниже метод проверки только на то, что юзер в группе админов с какой-то ролью откуда берется список прав.
checkMatchPermissions(...) проверяет любое первое совпадение прав юзера с требуемыми правами.
 public boolean checkUserControllerPermission(List<UserPermission> requiredPermissions) {
        List<PermissionDTO> usersPermissions = permissionService.getAuthorizedAdminPermissions();
        if (checkMatchPermissions(requiredPermissions, usersPermissions)) return true;
        return false;
    }


Если совпадений не найдено получаем 500 ошибку с сообщением "Доступ запрещен".
В общем, пока что всё выглядит отлично :)
Ну кроме извечной проблемы как называть методы и переменные)))
11 сен 19, 21:39    [21968925]     Ответить | Цитировать Сообщить модератору
 Re: Проверка наличия права пользователя выполнить данный метод  [new]
vas0
Member

Откуда: Таможенный союз (Россия, Казахстан)
Сообщений: 1279
Nixic
Если совпадений не найдено получаем 500 ошибку с сообщением "Доступ запрещен".
Если сделать code review, и критиканство навести :) , то

500 ошибка это же server error, нормальный результат должен быть "403 Forbidden"
так что можно еще логи посмотреть, может найдется какой то косяк

И этот фрагмент. if (someCheck()) return true else return false напоминает "индусский код". Понятней если просто написать return someCheck(), хотя метод лучше переименовать чтобы еще понятней было.
12 сен 19, 06:08    [21969056]     Ответить | Цитировать Сообщить модератору
 Re: Проверка наличия права пользователя выполнить данный метод  [new]
Nixic
Member

Откуда: Perm
Сообщений: 1886
vas0
Nixic
Если совпадений не найдено получаем 500 ошибку с сообщением "Доступ запрещен".

И этот фрагмент. if (someCheck()) return true else return false напоминает "индусский код". Понятней если просто написать return someCheck(), хотя метод лучше переименовать чтобы еще понятней было.

Да, какой-то оверхед получается)) Спасибо :)
12 сен 19, 07:57    [21969086]     Ответить | Цитировать Сообщить модератору
Все форумы / Java Ответить