Jhipster,防止用户更新其他用户创建的实体
Jhipster, prevent user to update entities created by other users
我一直在工作中使用 Jhipster 并且非常喜欢它。我被要求实施安全验证,即不允许一个用户编辑其他用户创建的实体。为此,我需要两件事:
首先,在所有实体中,添加与User实体的ManytoOne关系。
在后端中,在更新实体时在控制器中进行验证,以检查当前登录的用户是否与存储在数据库中的用户相同。在前端也有与 show/hide 编辑按钮相同的逻辑。
我已经为此做了一个 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 安全措施??
感谢帮助!!
这是 Spring 基于安全表达式的访问控制的工作,特别是您可以使用 @PreFilter
和自定义 PermissionEvaluator
注释您的方法,您将使用类似的逻辑来实现在您的 POC 中。如果您定义了一个 Owned
接口,该接口使用 User getOwner()
之类的方法对所有权进行建模并且您的所有实体 类 都将实现,则 PermissionEvaluator
可以是通用的并应用于多个实体类型.
见https://docs.spring.io/spring-security/site/docs/current/reference/html5/#el-access
带注释的方法应该在服务中而不是在资源控制器中。
此外,仅 UserService
不会帮助您找到当前经过身份验证的用户,您应该首先使用 JHipster 的 SecurityUtils
,然后如果您需要更多相关数据,则 ÙserService
。
我一直在工作中使用 Jhipster 并且非常喜欢它。我被要求实施安全验证,即不允许一个用户编辑其他用户创建的实体。为此,我需要两件事:
首先,在所有实体中,添加与User实体的ManytoOne关系。
在后端中,在更新实体时在控制器中进行验证,以检查当前登录的用户是否与存储在数据库中的用户相同。在前端也有与 show/hide 编辑按钮相同的逻辑。
我已经为此做了一个 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 安全措施??
感谢帮助!!
这是 Spring 基于安全表达式的访问控制的工作,特别是您可以使用 @PreFilter
和自定义 PermissionEvaluator
注释您的方法,您将使用类似的逻辑来实现在您的 POC 中。如果您定义了一个 Owned
接口,该接口使用 User getOwner()
之类的方法对所有权进行建模并且您的所有实体 类 都将实现,则 PermissionEvaluator
可以是通用的并应用于多个实体类型.
见https://docs.spring.io/spring-security/site/docs/current/reference/html5/#el-access
带注释的方法应该在服务中而不是在资源控制器中。
此外,仅 UserService
不会帮助您找到当前经过身份验证的用户,您应该首先使用 JHipster 的 SecurityUtils
,然后如果您需要更多相关数据,则 ÙserService
。