powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Java [игнор отключен] [закрыт для гостей] / Проверка наличия права пользователя выполнить данный метод
9 сообщений из 9, страница 1 из 1
Проверка наличия права пользователя выполнить данный метод
    #39859986
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем, привет!
Ни разу не реализовывал подобного, решил сначала спросить.

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


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

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

В общем буду рад любым теоретическим вариантам и еще больше кускам кода :)
Спасибо.
...
Рейтинг: 0 / 0
Проверка наличия права пользователя выполнить данный метод
    #39859987
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
упс, вот так правильно))
Код: java
1.
2.
3.
public ItemDTO save(ItemDto itemDto) {
    return repository.save(itemDto);
}


п.с. repository здесь - это JPA репозиторий, инжектится через @Autowired
...
Рейтинг: 0 / 0
Проверка наличия права пользователя выполнить данный метод
    #39859989
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nixic,
Это право уже не на метод как в теме озаглавлено.
Ну и права то где у тебя? В какой либе?
...
Рейтинг: 0 / 0
Проверка наличия права пользователя выполнить данный метод
    #39859993
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
@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) {
        //дополнительная логика по проверке
    }

}



идея понятна?
...
Рейтинг: 0 / 0
Проверка наличия права пользователя выполнить данный метод
    #39859996
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC SharpNixic,
Это право уже не на метод как в теме озаглавлено.
Ну и права то где у тебя? В какой либе?
Согласен, право на объект itemDTO, действия над ним, то есть на выполнение метода :)
Права в виде обычного List<String> прикрепляются в методе проверки в который передается авторизованный юзер и объект.
Там проверяется есть у них общая группа, т.е. состоят ли они, добавлены ли в общую группу.
...
Рейтинг: 0 / 0
Проверка наличия права пользователя выполнить данный метод
    #39859997
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpasha, почти понятна, главное, что через аннотации, как я и хотел это вполне реально, спасибо!
Попробую реализовать, если будут затыки, отпишусь. Ну и если сделаю - тоже.
...
Рейтинг: 0 / 0
Проверка наличия права пользователя выполнить данный метод
    #39860567
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpasha, Спасибо большое! :)
Заюзал идею примерно так:
1. Все права закинул в отдельный enum.
2. В контроллере (тут еще от swagger'a всякое, пусть тоже тут будет):

Код: java
1.
2.
3.
4.
5.
6.
7.
    @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. В сервисе метод переписал так:
Код: java
1.
2.
3.
4.
5.
6.
    @Override
    @Transactional
    @PreAuthorize("@permissionSecurity.checkUserControllerPermission(#requiredPermissions)")
    public List<DtoResponseDeleteStatus> deleteUsers(String requestIds, List<UserPermission> requiredPermissions) {
...
}


4. В компоненте permissionSecurity
Код: java
1.
2.
3.
4.
@Component("permissionSecurity")
public class PermissionSecurity {
...
}


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

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



Если совпадений не найдено получаем 500 ошибку с сообщением "Доступ запрещен".
В общем, пока что всё выглядит отлично :)
Ну кроме извечной проблемы как называть методы и переменные)))
...
Рейтинг: 0 / 0
Проверка наличия права пользователя выполнить данный метод
    #39860664
vas0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NixicЕсли совпадений не найдено получаем 500 ошибку с сообщением "Доступ запрещен".
Если сделать code review, и критиканство навести :) , то

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

И этот фрагмент. if (someCheck()) return true else return false напоминает "индусский код". Понятней если просто написать return someCheck(), хотя метод лучше переименовать чтобы еще понятней было.
...
Рейтинг: 0 / 0
Проверка наличия права пользователя выполнить данный метод
    #39860683
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vas0NixicЕсли совпадений не найдено получаем 500 ошибку с сообщением "Доступ запрещен".

И этот фрагмент. if (someCheck()) return true else return false напоминает "индусский код". Понятней если просто написать return someCheck(), хотя метод лучше переименовать чтобы еще понятней было.
Да, какой-то оверхед получается)) Спасибо :)
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Проверка наличия права пользователя выполнить данный метод
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]