@BITniki

Spring Security. Как дать возможность юзеру изменять только свои объекты?

Изучаю spring, Пишу REST сервер, на котором есть сущность пользователь и объекты, созданые этим пользователем.

Хочу сделать так, чтобы пользователь мог манипулировать только своими объектами (у объекта есть поле, ссылающийся на пользователя).
То есть сделать такое "право", дающее доступ к объекту только если условный id создателя объекта и пользователя совпадают

Есть ли способ проверять подобные права на уровне Spring Security?
Или лучше проверять вручную, на уровне сервисов?
  • Вопрос задан
  • 123 просмотра
Решения вопроса 1
Maksclub
@Maksclub
maksfedorov.ru
Вы можете сделать свой Voter для определения, может ли юзер изменять конкуретную сущность

@Override
public int vote(Authentication authentication, MethodInvocation methodInvocation, Collection<ConfigAttribute> attributes) {
  for (ConfigAttribute configAttribute : attributes) {
    if (supports(configAttribute)) {
      User principal = (User) authentication.getPrincipal();
      Spreadsheet domainObjectInstance = (Spreadsheet) getDomainObjectInstance(methodInvocation);
      return hasSpreadsheetAccess(principal, domainObjectInstance) ? ACCESS_GRANTED : ACCESS_DENIED;
    }
  }
  return ACCESS_ABSTAIN;

Тут в voter логика доступа к объекту Spreadsheet у объекта User
Метод hasSpreadsheetAccess видимо определяет, может ли конкретный юзер доступ к конкретному Spreadsheet, например проверка spreadsheet.GetUser().GetID() == user.GetID()

остается только данный voter повесить на метод контроллера или сервиса через аннотацию @Secured и зарегать этот voter в конфиге

Источник: https://blog.jdriven.com/2019/10/spring-security-c...
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Bell Integrator Ульяновск
До 400 000 ₽
Bell Integrator Хабаровск
До 400 000 ₽
Bell Integrator Ижевск
До 400 000 ₽
26 апр. 2024, в 18:27
200000 руб./за проект
26 апр. 2024, в 18:24
80000 руб./за проект
26 апр. 2024, в 18:00
500 руб./за проект