【问题标题】:Jhipster, prevent user to update entities created by other usersJhipster,防止用户更新其他用户创建的实体
【发布时间】:2019-03-07 01:45:07
【问题描述】:

我一直在我的工作中实施 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 的方法来做到这一点???可能是春季安全中我不知道的东西??

感谢您的帮助!

【问题讨论】:

    标签: spring-security jhipster


    【解决方案1】:

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

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

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

    另外,单独使用UserService 并不能帮助您找到当前经过身份验证的用户,如果您需要更多相关数据,您应该先使用 JHipster 的 SecurityUtils,然后再使用 ÙserService

    【讨论】:

    • 感谢 Gaël 迅速而明确的回复。我要去看看这个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多