bounty将在14小时后过期。回答此问题可获得+100声望奖励。alexsaleh希望引起更多关注此问题。
由于@EnableJpaAuditing
注解,自定义AuditorAware
类被调用到getCurrentAuditor()
,以填充审计字段lastCreatedBy
和lastModifiedBy
。
@Component
@RequiredArgsConstructor
public class AuditorAwareImpl implements AuditorAware<User> {
private final UserRepository userRepository;
@Override
public Optional<User> getCurrentAuditor() {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
return Optional.of(authentication)
.map(Authentication::getName)
.flatMap(userRepository::findByUsername);
}
}
字符串
这个类需要调用一个存储库来获取信息(从安全上下文中提取用户名/主体并获取用户)。
这在每次保存一个实体的情况下工作得很好,但是当使用saveAll()
进行批量插入时,操作变成了一个循环,以便为每个实体/行调用getCurrentAuditor()
。
在具有审计数据的同时具有高性能批处理插入的最佳方法是什么?在我的示例中,我处理的是来自同一用户的批量导入,因此所有记录都将具有相同的审计值。
3条答案
按热度按时间ars1skjm1#
我们有类似的问题,我记得最终我们使用二级缓存来提高性能,你也可以缓存这个方法的结果
findByUsername
看看这些样本:
https://www.baeldung.com/spring-cache-tutorial
https://medium.com/@himani.prasad016/caching-in-hibernate-3ad4f479fcc0的
Spring中的
saveAll()
只是在后台调用save()
字符串
hyrbngr72#
您可以实现
CustomAuthenticationConverter
(扩展org.springframework.core.convert.converter.Converter
)将JWT token转换为
CustomAuthenticationToken
(扩展org.springframework.security.authentication.AbstractAuthenticationToken
)在此转换器中,您可以将数据库中的
User
信息放入CustomAuthenticationToken.details
字段中。此
CustomAuthenticationToken
可通过以下方式访问:(CustomAuthenticationToken) SecurityContextHolder.getContext().getAuthentication()
个您可以在
SecurityFilterChain
配置中注册自定义转换器。字符串
这样您就不需要一直调用数据库,因为
SecurityContext
中有User
信息。uqdfh47h3#
据我所知,您正在使用Spring Security资源服务器,因此您可以使用自定义声明转换器在我的项目中,我使用了以下配置
字符串
我的OauthSubClaimAdapter是:
型
在您的身份验证对象中,现在您可以检索所有包含LOGGED_USER_INFO对象的JWT声明