Spring @Before更改每个用户登录

我有一个@Aspect类,它执行@Before方法并使用用户登录中的一些Id拦截所有查询。 但问题是:每次用户登录时,@Before方法的Id都会更改为所有已登录用户,只需更改当前用户即可。

简单的过程:当用户登录时,@ Aspect类获取其id以拦截所有查询。 但是这个id正在为每个登录用户而改变。 也许应该是会话的问题,我真的不知道。

方面类:

@Aspect @Component @Transactional(propagation = Propagation.REQUIRED) public class TenancyAspect { @Autowired private EntityManager manager; @Autowired private AppUserDetailsService appUserDetailsService; @Before("execution(* com.tc.tcqualidade.repository.*.*(..)) " +"&& !execution(* com.tc.tcqualidade.repository.UsuarioRepository.porEmailEStatus(..))" +"&& !execution(* com.tc.tcqualidade.repository.UsuarioRepository.permissoes(..))") public void definirTenant() { String tenantid = appUserDetailsService.getTenantId(); if (tenantid != null) { manager.unwrap(Session.class).enableFilter("tenant").setParameter("id", tenantid); } } } 

登录类:

 @Service public class AppUserDetailsService implements UserDetailsService { private String tenantId = null; @Autowired private UsuarioRepository usuarioRepository; @Override public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException { Optional usuarioOptional = usuarioRepository.porEmailEStatus(email); Usuario usuario = usuarioOptional.orElseThrow(() -> new UsernameNotFoundException("Usuário e/ou senha incorretos")); tenantId = usuario.getEmpresa().getId().toString(); return new UsuarioSistema(usuario, getPermissoes(usuario)); } private Collection getPermissoes(Usuario usuario) { Set authorities = new HashSet(); List permissoes = usuarioRepository.permissoes(usuario); permissoes.forEach(p -> authorities.add(new SimpleGrantedAuthority(p.toUpperCase()))); return authorities; } public String getTenantId(){ return tenantId; } } 

我在使用@Autowired时看到了同样的行为。 Spring不会在每次访问时创建一个新实例,除非你告诉它这样做,所以对象在所有访问中共享。 登录的用户导致所有登录用户更改为该用户的ID。 您可能需要使用一个服务会话作用域:

 @Service @Scope(value="session", proxyMode= ScopedProxyMode.TARGET_CLASS)