我在工作中一直采用Jhipster并热爱它。我被要求实施安全验证,即不允许一个用户编辑其他用户创建的实体。为此,我需要两件事:
首先,在所有实体中,添加与User实体的ManytoOne关系。
在后端中,在更新实体时要在控制器中进行验证,以检查当前登录的用户是否与数据库中存储的用户相同。在前端,同样的逻辑来显示/隐藏编辑按钮。
我已经为此完成了一个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的方法?可能是我不知道的春季安全防护措施?
感谢帮助!
答案 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
。