我有一个 @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<Usuario> 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<? extends GrantedAuthority> getPermissoes(Usuario usuario) {
Set<SimpleGrantedAuthority> authorities = new HashSet<>();
List<String> 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)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)