Использовать авторизованного пользователя в атрибуте ресурса при создании запроса - PullRequest
0 голосов
/ 07 апреля 2020

У меня есть сущность, которая имеет атрибут MyUser author;. Я также использую этот класс в процессе пользовательской авторизации для создания экземпляра MyUserPrincipal. (Я черпал вдохновение из сообщения Callicoder в блоге и хранилище .)

Фрагмент части процедуры ведения журнала:

public class CustomOAuth2UserService extends DefaultOAuth2UserService {
    @Override
    public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2AuthenticationException {
        // He I use myUserRepository, to load MyUser instance and than return MyUserPrincipal which implements OAuth2User, UserDetails...
    }
}

Теперь у меня есть хранилище для сущности книги, например. Книга может выглядеть так:

@Entity
@Getters // project lombook magic here
@Setters
public class Book {
    private MyUser author;
    private String title;
}

Я могу создать новый ресурс, используя запрос POST к http://localhost/api/books с такими данными:

{
 "author":"api/authors/42",
 "title":"stackoverflow forever"
}

Мой вопрос : можно ли легко (без специального контроллера) использовать «authentication.principal.userId» из SecurityContext для заполнения автором вновь созданного ресурса / записи? Я бы хотел запретить пользователю моего API вообще отправлять поле автора.

1 Ответ

1 голос
/ 07 апреля 2020

Ну, я не знаю, что вы подразумеваете под "пользовательским контроллером", но @RestController за вашим /api/books URI может использовать @AuthenticationPrincipal. Тогда вам больше не нужно отправлять свой идентификатор автора, если он является частью MyUserPrincipal.

@PostMapping("/api/books")
public SomeDTO saveBook(@AuthenticationPrincipal MyUserPrincipal principal) {

  if (principal != null) { // user is logged in and not e.g. anonymous
     // principal.getId(); use this to save your book
  }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...