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

Для реализации функционала, который позволит пользователю изменять только свои объекты, вам потребуется использовать Spring Security.

В Spring Security существует механизм аутентификации и авторизации, который позволяет управлять доступом к определенным ресурсам в приложении. Чтобы реализовать требуемый функционал, вам потребуется применить следующие шаги:

1. Создание модели данных
Создайте модель данных, которая будет представлять объекты пользователей, например, класс User.

2. Конфигурация Spring Security
Настройте Spring Security для управления аутентификацией и авторизацией в вашем приложении. Для этого вам потребуется создать класс, расширяющий WebSecurityConfigurerAdapter, и переопределить метод configure(HttpSecurity http). В этом методе вы можете настроить требуемый уровень доступа для различных URL-адресов в вашем приложении.

3. Разграничение доступа к объектам пользователей
Для реализации функционала, который позволит пользователям изменять только свои объекты, вы должны проверить, что текущий авторизованный пользователь соответствует объекту, который он пытается изменить. Если это не так, то должны быть применены дополнительные меры безопасности.

Для начала, добавьте поле createdBy в класс User. Это поле будет хранить информацию о создателе объекта пользователя. Затем добавьте метод getCurrentUser() в ваш класс контроллера или сервиса, который будет возвращать текущего авторизованного пользователя.

Для проверки доступа к объектам пользователей, может быть использован аспект безопасности. В Spring Security это можно сделать с использованием аннотации @PreAuthorize. Поставьте эту аннотацию перед методом контроллера или сервиса, который модифицирует объект пользователя. Внутри этого метода, вы можете проверить, что username пользователя, который выполнил запрос, совпадает с createdBy объекта пользователя.

Пример кода для проверки доступа к объекту пользователя:

   @PreAuthorize("#user.createdBy == authentication.principal.username")
   public void updateUser(User user) {
       // реализация обновления объекта пользователя
   }

Здесь #user.createdBy - это поле createdBy объекта пользователя, а authentication.principal.username - это имя авторизованного пользователя.

Обратите внимание, что для использования аннотации @PreAuthorize, вам потребуется включить выражения SpEL (Spring Expression Language) в вашем проекте.

4. Обработка исключений безопасности
В случае, если пользователь пытается изменить объект, который не является его собственным, может возникнуть исключение безопасности. В вашем коде, вы можете обработать это исключение и предоставить различные сообщения или действия для пользователя.

Вы можете создать глобальный обработчик исключений, используя аннотацию @ControllerAdvice, и переопределить метод handleAccessDeniedException(). Внутри этого метода, вы можете предоставить сообщение об ошибке или перенаправить пользователя на другую страницу.

Пример кода для обработки исключений безопасности:

   @ControllerAdvice
   public class SecurityExceptionHandler {
       @ExceptionHandler(AccessDeniedException.class)
       public String handleAccessDeniedException() {
           // реализация обработки исключения
       }
   }

Здесь AccessDeniedException - это исключение, которое возникает, если доступ к объекту запрещен.

Это основные шаги, которые вам потребуется выполнить для реализации функционала, который позволит пользователю изменять только свои объекты. Обратите внимание, что это только примерный подход, и в зависимости от требований вашего приложения, возможно, потребуются дополнительные настройки и обработка различных сценариев использования.