@BITniki

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

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

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

Есть ли способ проверять подобные права на уровне Spring Security?
Или лучше проверять вручную, на уровне сервисов?
  • Вопрос задан
  • 136 просмотров
Решения вопроса 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...
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы