我的AuthenticatedPrincipal
是一个Hibernate管理实体。当我使用@AuthenticationPrincipal
开箱即用时,我会获得一个分离的实体并运行到LazyLoadingExceptions
。
我使用OpenSessionInViewPattern
。
我想"重新加入"实体通过在传递给Controller方法之前调用session.merge(entity)
。
有没有办法创建扩展@AuthenticationPrincipal
让我们说@MergedAuthenticationPrincipal
并自定义Spring Security来预处理这些主体,以便我可以合并它们?
答案 0 :(得分:0)
您似乎无法直接扩展@AuthenticationPrincipal或基础AuthenticationPrincipalArgumentResolver,但您可以重新实现AuthenticationPrincipalArgumentResolver的功能并将它们附加到您自己的自定义注释中。此外,AuthenticationPrincipalArgumentResolver似乎支持某种用作自定义注释的基础,如javadocs所示。
我不清楚有关示例如何工作的详细信息。也许对如何使用构建Annotations有更多了解的人可以为我们两个人解释它。我自己可能只需要使用AuthenticationPrincipalArgumentResolver作为指南来构建我自己的Annotation,并在resolveArgument()方法中添加对merge()的调用。
答案 1 :(得分:0)
如@cmorris所建议的那样,需要自定义解析程序才能从Session中获取主体对象并重新附加它。可以声明一个自定义MergedAuthenticationPrincipalArgumentResolver
并将其添加到原始AuthenticationPrincipalArgumentResolver
之前 ,因此不需要自定义注释,并且所有使用@AuthenticationPrincipal
的方法都会自动附加正确的附件可以访问主体的版本和访问延迟加载的集合。
我想出了以下解决方案: https://gist.github.com/MaZderMind/e415be1c5e15b7c36e07df85a91bb673
我认为我对每个请求都创建并关闭一个新的EntityManager
感到不满意,但这至少是一个起点。
如果您正在研究此问题,那么您可能还对https://stackoverflow.com/a/26697333感兴趣,它可以帮助您根据每个请求从数据库刷新您的Principal,从而可以即时更改其权限,而无需再次注销/登录。