spring-security Spring Security Hibernate使用惰性关联加载用户

kxe2p93d  于 2022-11-11  发布在  Spring
关注(0)|答案(2)|浏览(127)

我正在构建一个SpringDataJPA应用程序,并使用SpringSecurity保护我的API调用。
Principal是通过我的自定义实现UserDetailsService.loadByUsername(...)加载的,只检索User实体本身,因为默认情况下它的所有关联都是LAZY。
这是通过Spring Filter在每个控制器被命中之前完成的(我正在进行JWT Auth)
然而,对于某些请求(比如POST /todo),我还需要加载用户的一些惰性关联(用户的Todos),以便向它们添加新数据并将其持久化。
我的目标是在通过SecurityContextHolder.getContext().getAuthentication().getPrincipal()获取主体时已经加载了一些关联(取决于上下文),而不必将它们设置为EAGER。
当我需要关联时,可以重写UserDetailsService.loadByUsername以JOIN FETCH请求关联。
谢谢

kt06eoxx

kt06eoxx1#

让这些关联在代码中被请求时被延迟加载会有什么问题呢?你可以总是先从实体管理器中分离实体,然后根据上下文用你需要的提取连接重新加载它。类似于:

User u = (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
entityManager.detach(u);
u = entityManager.createQuery("from User u join fetch ... where u.id = :id")
    .setParameter("id", u.getId())
    .getResultList()
    .get(0);
// Work with u
puruo6ea

puruo6ea2#

你根本不需要加载@ManyToOne(像Todos一样)的关联部分,只需要创建新的TodoEntity,给它分配一个用户并保存。
如果您需要修改任何内容,最好将用户的所有关联与用户分开处理。

相关问题