Я хотел бы защитить свой сервер ресурсов с помощью Spring Security 5, чтобы его можно было использовать для многих пользователей.У меня есть объект Task
, который содержит поле userId
.
@Entity
@Table(name = "tasks")
data class Task(
@NotBlank
val name: String,
val description: String?,
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
@SequenceGenerator(name = "task_id_seq")
val id: Long = 0,
@UUID //custom validation annotation
val userId: String? = null
)
Я нашел способ использовать SpEL для внедрения принципала JWT в запрос.Что я уже сделал, так это переопределил метод findAll()
в моей interface TaskRepository : JpaRepository<Task, Long>
аннотацией @Query
:
@Query("select t from Task t where t.userId = :#{principal.claims['sub']}")
//sub is a userId in OpenID Connect 1.0, claim is a Map<String, Object>
override fun findAll(): List<Task>
Проблема в том, что я хотел бы сделать нечто подобное с методом save()
.Единственное, что я нашел, - это обновить уже сохраненную сущность.Я создал совершенно новый метод:
@Modifying
@Query("update Task t set t.userId = :#{principal.claims['sub']} where t.id = :id")
fun setUserId(@Param("id") id: Long)
, но проблема в том, что мне нужно вызвать этот метод в моем TaskService, который выглядит следующим образом:
@Transactional
fun createTask(taskDto: CreateTaskDto): Task {
val task = taskRepository.save(taskDto.toEntity())
taskRepository.setUserId(task.id)
return task
}
Можно ли добавитьэта информация автоматически каждый раз, когда я сохраняю сущность в моей базе данных?Тогда мой код внутри TaskService будет выглядеть так:
@Transactional
fun createTask(taskDto: CreateTaskDto): Task {
return taskRepository.save(taskDto.toEntity())
}