java - 根据编辑请求中的用户角色选择要使用的 pojo
问题描述
所以我想知道基于用户角色处理编辑请求的最佳方式是什么。
假设我有以下 PostMapping:
@PostMapping(value = "/edit")
public ResponseEntity<String> editIoc(@RequestBody GeneralPojoAllFields editRequest)
GeneralPojoAllFields 看起来像这样:
public class GeneralPojoAllFields {
private String firstName;
private String lastName;
private String onlyAdminCanEditField;
}
这是管理员可以使用的 pojo,最终将映射到要保存到数据库的实体类中。但是,如果我们有一个想要编辑它的普通用户,并且假设他们在 UI 中不受限制,那么这种设计会起作用吗?我目前在想的是我会有一个像这样的用户 pojo:
public class UserPojo {
private String firstName;
private String lastName;
}
在请求映射到来之后,我们检查用户是普通用户还是管理员。如果它是普通用户,我们只需将 GeneralPojoAllFields 映射到 UserPojo,它不会映射到 onlyAdminCanEditField 并从那里继续。
有一个更好的方法吗?
解决方案
首先,您的后端应尽可能独立于 UI。所以,UI 中的访问控制是一个很好的设计,但你不应该依赖它。
现在,回到你的问题,是的,你可以用它SecurityContextHolder
来确定用户是否是普通用户/管理员。但是,如果可能的话,我建议制作两个控制器,一个用于管理员,一个用于普通用户。在管理控制器上使用@PreAuthorize
以限制访问。拥有两个独立的控制器将极大地提高代码的可读性。
此外,您可以从两个控制器调用相同的服务类方法。由于您已经有两个 POJO 类,您可以使用它们@RequestBody
并让 Spring 为您处理映射。
推荐阅读
- php - 我想要特定秒之前的日期时间
- python - Python在乘法时产生奇怪的小数
- go - go.mod 在修订版中有 post-v0 模块路径“git.example.com/owner/repo/v3”...?
- build - 如何找出 Visual Studio 2019 重建未修改的 .NET Core 项目的确切原因
- python - 在画布上创建可滚动表格
- cassandra - gremlin-groovy 不是可用的 GremlinScriptEngine
- ios - 想要将 b2b 应用程序转换为常规应用程序
- php - 如何在 PrestaShop 的 .tpl 文件中创建全局变量?
- ionic-framework - 为 toast ionic 4 添加很棒的字体
- laravel - Windows 上用于保存在公共路径中的 Laravel 权限