使用Spring Security和Web MVC保存属于经过身份验证的用户的对象时,要遵循的最佳模式是什么?
我遇到的所有教程都展示了如何对登录的用户进行身份验证,并且这些教程尽可能远,他们没有解释如何使用多个用户及其数据。例如:登录用户正在保存新的博客帖子。这是控制器的样子:
@PostMapping("/blog/save")
public String blogSavePost(@AuthenticationPrincipal CurrentUser currentUser, BlogForm blogForm) {
blogService.save(currentUser, blogForm);
return "redirect:/blog";
}
是否应将currentUser
传递给blogService
,然后服务将其设置在实体Blog
上(然后传递给BlogRepository
进行保存)?在每次保存或编辑时都必须传递此内容似乎有点乏味。
编辑对象时 - 由于正在保存的对象的id被传递给控制器(作为表单对象的一部分的参数),因此用户可以更改它。服务层应该如何验证保存的数据是否属于用户?我认为有一种简单的方法可以使用Spring Security处理这个问题,我只是没有遇到它是什么......
答案 0 :(得分:0)
问题1
完全取决于你。我只是在将关联传递给服务之前在Controller中设置关联:
问题2。
您可以通过在youir控制器中定义绑定器来阻止某些字段的绑定:
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.setDisallowedFields("userId");
}
您还可以使用方法级安全性来阻止用户编辑属于它们的实体以外的实体。请看这里的例子:
或者,您可以使用Web安全表达式来保护端点以进行保存/更新/删除请求。
http://docs.spring.io/spring-security/site/docs/current/reference/html/el-access.html#el-access-web