强制在多租户应用程序的每个实体上设置活动主体用户

时间:2017-06-19 13:10:06

标签: spring-boot spring-security spring-data-jpa jpql jhipster

我有一个多租户jhipster应用程序,其中有几个我想要关联的实体或者#34;锁定"访问时使用当前活动用户。我这样做是通过在我的实体上创建一个多对一的关系到用户表。

通过在我的存储库中创建类似的查询来轻松处理查询:

@Query("select myEntity from MyEntity myEntity where myEntity.user.login = ?#{principal.username}")
List<MyEntity> findByUserIsCurrentUser();

我正在寻找一种直接的创建,更新和删除方法,但强制用户在服务器端设置。到目前为止,我提出的可能的解决方案是:

  1. 重写我所有存储库中的所有JPA查询。这有点单调乏味,我不太确定语法。
  2. 在保存任何内容之前,实际上在我的实体上设置用户对象,该实体在编程中具有编程关系。这将要求我从安全上下文获取当前登录并查询用户存储库。这将要求我将UserRepository注入几乎每个存储库,并执行额外的查询来加载用户对象。这似乎效率低下。例如:

    private final MyEntityRepository myEntityRepository;
    private final UserRepository userRepository;
    @PutMapping("/my-entities")
    @Timed
    public ResponseEntity<MyEntity> updateMyEntity(@Valid @RequestBody MyEntity myEntity) throws URISyntaxException {
        log.debug("REST request to update MyEntity : {}", myEntity);
    
        User currentUser = new User();
        currentUser.setLogin(SecurityUtils.getCurrentUserLogin());
        myEntity.setUser(current);
    
        MyEntity result = myEntityRepository.save(myEntity);
        return ResponseEntity.ok()
            .headers(HeaderUtil.createEntityUpdateAlert(ENTITY_NAME, myEntity.getId().toString()))
            .body(result);
    }
    
  3. 那么,有没有&#34;对&#34;强迫关系设置的方式(不从客户端传递)?如果是这样,它是什么以及我将如何去做呢?

0 个答案:

没有答案