Spring @Before 更改每个用户登录名

2024-06-28

我有一个 @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(使用前将#替换为@)

Spring @Before 更改每个用户登录名 的相关文章

随机推荐

  • 如何在 React Native 导航中使用 modalPresentationStyle .fullscreen

    我正在尝试创建我的第一个 React Native 应用程序 我有一个登录屏幕 如果用户想要注册 我想从该屏幕导航到注册屏幕 为了实现这一目标 我正在考虑在第一个屏幕 登录 上方打开一个模式 我创建了以下内容 import Navigati
  • 使用 R 绘图将目录添加到 PDF

    我正在 R 中创建大量绘图并将它们保存为 PDF 使用 grDevices pdf 有没有一种简单的方法可以在创建 PDF 时将 元数据 目录添加到 PDF 中 我并不是想添加一个单独的页面 而是添加一个 TOC 像 Preview app
  • 尝试将实例强制转换为 PersistenceCapable 失败。确保它已得到增强

    我第一次尝试 OpenJPA 2 0 1 并得到 79 WARN main openjpa Runtime The configuration property named openjpa Id was not recognized and
  • Docker 镜像占用大量空间?

    docker ps aq 仅显示 7 9 张图像 var lib docker graph 显示了 n 张图像 当我创建文件时 由于系统已满错误 出现写入错误 我尝试创建符号链接 但我无法移动所有 docker 的东西 删除 var lib
  • 在一个模型中对多个地址进行地理编码

    我正在尝试使用地理编码器对模型中的 2 个地址进行地理编码 但我无法让 gem 按我想要的方式工作 这是我应用于我的模型的代码 class Sender lt ActiveRecord Base validates presence of
  • Excel VBA 日期格式

    我有一个包含多个日期的电子表格 这些通常出现在mm dd yyyy or mm dd yyyy hh mm 问题是日期并不总是正确输入 我想进行检查以确保它们是代码中的日期 我最初的想法是使用IsDate检查或CDate但这似乎不起作用 它
  • ctrl-] 不适用于 tcl 代码导航

    I am new to Tcl Tk I am using Vim to code and browsing The syntax highlighting for Tcl Tk is working fine The jump into
  • 如何在 MATLAB 中定位子图?

    我在设置子图的位置时遇到问题 我在循环内使用子图 但是当我尝试对子图进行特殊定位时 它不起作用 这是我的代码 h subplot 2 2 3 set h position 0 15 0 15 0 4 0 4 plot d3 S3 Color
  • WCF/WebService:可互操作的异常处理

    我知道 WCF 会将异常转换为错误并将其作为 SOAP 消息发送回来 但我想知道这是否真正具有互操作性 我想我很难弄清楚这种可能的情况 客户端 Java 调用 WCF 服务 登录服务 服务器检查授权是否正确 用户授权失败 服务器抛出 Una
  • 使用地理位置按钮检索当前位置和邮政编码

    我想放置一个Geolocation button靠近我的UISearchBar 点击后 它应该返回 zip 例如 20043 我将使用 ZIP 中的值来获取我附近的建筑物列表 如果有人可以帮助我使用位置按钮 以及实现仅返回 ZIP 的方法是
  • 使用 Autofac WcfIntegration 时如何处理构造函数异常

    当 WCF 服务的构造函数接受依赖项时 有没有办法处理该构造函数抛出的异常 并且IoC 容器 本例中为 AutoFac 对依赖项的实例化导致了异常 考虑具有以下构造函数的 WCF 服务 public InformationService I
  • Matlab——处理对象

    有一个句柄类Foo classdef Foo lt handle properties SetAccess public GetAccess public x end methods function obj foo x construct
  • java轻量级调试器[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个轻量级的 java 调试器 无论是在 IDE 中还是独立的 命令行或 GUI 中 我正在使用 ant 和 vim 并且尝试过
  • 在导出之前将对象分配给变量作为模块默认警告

    import axios from axios const baseUrl http localhost 3001 persons const getAll gt return axios get baseUrl const create
  • C++ 模板专门化以提供额外的成员函数?

    如何以非内联方式为专用模板提供额外的成员函数 IE template
  • Eslint 错误:不要嵌套三元表达式

    我正在使用 React js 开发一个项目 并且使用 eslint 时出现此错误 不要嵌套三元表达式 这是我的代码 const MyApp gt return lt gt var1 var2
  • 是否可以加载没有图像名称的图像?

    是否可以加载没有图像名称的图像 像这样 img src http www example com 只使用 URL 的原因是因为 URL 上每次都会有其他图像 因此图像名称是动态的 是的 当然了 请记住 文件系统和 HTTP 请求 响应之间存
  • 在 Spark 中访问数组列

    Spark DataFrame 包含类型为 Array Double 的列 当我尝试将其返回到 map 函数时 它会抛出 ClassCastException 异常 以下 Scala 代码生成异常 case class Dummy x Ar
  • PowerShell:导入不带标题的 CSV 并删除部分重复行

    我有一个日志文件 其格式为 CSV 没有标题 第一列基本上是所记录问题的唯一标识符 对于同一问题标识符 可能有多行具有不同的详细信息 我想删除第一列重复的行 因为此时我不需要其他数据 目前我对 PowerShell 已经有了相当基本的了解
  • Spring @Before 更改每个用户登录名

    我有一个 Aspect 类 它执行 Before 方法并拦截用户登录时带有某些 Id 的所有查询 但问题是 每次用户登录时 所有登录用户的 Before 方法的 Id 都会发生变化 只需更改当前用户即可 简单的过程 当用户登录时 Aspec