如何使用Spring Security从Spring Data JPA加载经过身份验证的用户的实体模型,以在其他JPA存储库中使用?

2020年12月1日 105点热度 0条评论

我有一个UserEntity模型和相应的UserRepository.类似地,我有BookEntity模型和BookRepository。图书与用户具有@ManyToOne关系。

因此,在Book实体中,存在一个使用@ManyToOne注释映射为FK的用户实体的ID的字段。当我想基于用户检索书籍列表时,我使用Spring Data JPA从List<BookEntity> findByUser(UserEntity user);调用方法BookRepository

我可以在Spring安全性的帮助下加载当前经过身份验证的用户,但这为我提供了一个UserDetails对象。我需要的是UserEntity对象,以便可以将其传递给BookRepository方法。

现在,正在做的是从Optional<UserEntity> findByUsername(String username);调用UserRepository来获取UserEntity,为此,我从Spring安全提供的UserDetails实例中获取用户名。然后将此UserEntity模型传递给BookRepository方法。

我想知道这是加载UserEntity模型以传递到BookRepository的正确方法还是有其他方法?如果不是,我是否将Book正确地映射到User?

任何帮助将不胜感激。

解决方案如下:

在您的BookRepository中执行以下操作

@Query("FROM Book b where b.user.userName = :userName")
List<Book> findBooksForUser(@Param("userName") String userName);

您可以在类似的控制器中获取当前用户的用户名

@RequestMapping(value = "/books", method = RequestMethod.GET)
@ResponseBody
public String getBooks(Authentication authentication) {
  if(authentication != null){
    //Call bookRepo.findBooksForUser(authentication.getName())
  }

  ....
}