Jhipster,阻止用户更新其他用户创建的实体

时间:2018-10-01 22:29:23

标签: spring-security jhipster

我在工作中一直采用Jhipster并热爱它。我被要求实施安全验证,即不允许一个用户编辑其他用户创建的实体。为此,我需要两件事:

  1. 首先,在所有实体中,添加与User实体的ManytoOne关系。

  2. 在后端中,在更新实体时要在控制器中进行验证,以检查当前登录的用户是否与数据库中存储的用户相同。在前端,同样的逻辑来显示/隐藏编辑按钮。

我已经为此完成了一个POC,它可以工作,但是有点难看,请检查代码:

public ResponseEntity<Entry> updateEntry(@RequestBody Entry entry) throws URISyntaxException {
        log.debug("REST request to update Entry : {}", entry);
        if (entry.getId() == null) {
            throw new BadRequestAlertException("Invalid id", ENTITY_NAME, "idnull");
        }

        //here is my logic 
        Optional<Entry> entry_db = entryRepository.findOneWithEagerRelationships(entry.getId());
        if(!entry_db.get().getUser().getId().equals(userService.getUserWithAuthorities().get().getId())) {
            //throw someexception
        }
        //
        Entry result = entryRepository.save(entry);
        return ResponseEntity.ok()
            .headers(HeaderUtil.createEntityUpdateAlert(ENTITY_NAME, entry.getId().toString()))
            .body(result);
    }

是否有更好的或OOTB的方法?可能是我不知道的春季安全防护措施?

感谢帮助!

1 个答案:

答案 0 :(得分:1)

这是基于Spring Security基于表达式的访问控制的一项工作,特别是您可以使用@PreFilter和将使用与POC中类似的逻辑实现的自定义PermissionEvaluator来注释方法。如果您定义一个PermissionEvaluator接口,该接口使用Owned这样的方法对所有权建模,并且所有实体类都将实现,那么User getOwner()可能是通用的,并且可以应用于几种实体类型。

请参见https://docs.spring.io/spring-security/site/docs/current/reference/html5/#el-access

带注释的方法应该在服务中,而不是在资源控制器中。

此外,仅UserService并不能帮助您找到当前已通过身份验证的用户,如果需要有关此数据的更多信息,则应首先使用JHipster的SecurityUtils,然后使用ÙserService