根据编辑请求中的用户角色选择要使用的 pojo
Choosing what pojo to use based on the user role on an edit request
所以我想知道基于用户角色处理编辑请求的最佳方式是什么。
假设我有以下 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,它最终会映射到实体 class 以保存到数据库中。但是,如果我们有一个普通用户想要对其进行编辑,并且假设他们不受 UI 的限制,那么该设计是否可行?我目前在想的是我会有一个像这样的用户 pojo:
public class UserPojo {
private String firstName;
private String lastName;
}
请求映射到来后,我们检查用户是普通用户还是管理员。如果是普通用户,我们只需将 GeneralPojoAllFields 映射到 UserPojo,它不会映射到 onlyAdminCanEditField 并从那里继续。
有更好的方法吗?
好吧,这取决于您认为更好的方法。它还在一定程度上取决于您的数据源。但由于这里没有这方面的信息,我建议更好的方法是继承。
使 UserPojo
超 class 和 GeneralPojoAllFields
扩展 class。
UserPojo.java:
public class UserPojo {
private String firstName;
private String lastName;
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public UserPojo() {}
public UserPojo(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
}
GeneralPojoAllFields.java:
public class GeneralPojoAllFields extends UserPojo {
private String onlyAdminCanEditField;
public String getOnlyAdminCanEditField() {
return onlyAdminCanEditField;
}
public void setOnlyAdminCanEditField(String onlyAdminCanEditField) {
this.onlyAdminCanEditField = onlyAdminCanEditField;
}
public GeneralPojoAllFields() {}
public GeneralPojoAllFields(String firstName, String lastName, String onlyAdminCanEditField) {
super(firstName, lastName);
this.onlyAdminCanEditField = onlyAdminCanEditField;
}
}
App.java:
public class App {
public static void main(String[] args) {
UserPojo up1 = new UserPojo();
up1.setFirstName("MyFirstName");
up1.setLastName("MyLastName");
GeneralPojoAllFields gpaf1 = new GeneralPojoAllFields();
gpaf1.setFirstName("MyFirstName");
gpaf1.setLastName("MyLastName");
gpaf1.setOnlyAdminCanEditField("yes");
}
}
首先,您的后端应尽可能独立于 UI。所以,UI 中的访问控制是一个很好的设计,但你不应该依赖它。
现在,回到您的问题,是的,您可以使用 SecurityContextHolder
来确定用户是否经常 user/admin。但是,如果可能的话,我建议制作两个控制器,一个用于管理员,一个用于普通用户。在管理控制器上使用 @PreAuthorize
来限制访问。拥有两个独立的控制器将极大地提高代码的可读性。
此外,您可以从两个控制器调用相同的服务 class 方法。由于您已经有两个 POJO classes,您可以在 @RequestBody
中使用它们并让 Spring 为您处理映射。
所以我想知道基于用户角色处理编辑请求的最佳方式是什么。
假设我有以下 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,它最终会映射到实体 class 以保存到数据库中。但是,如果我们有一个普通用户想要对其进行编辑,并且假设他们不受 UI 的限制,那么该设计是否可行?我目前在想的是我会有一个像这样的用户 pojo:
public class UserPojo {
private String firstName;
private String lastName;
}
请求映射到来后,我们检查用户是普通用户还是管理员。如果是普通用户,我们只需将 GeneralPojoAllFields 映射到 UserPojo,它不会映射到 onlyAdminCanEditField 并从那里继续。
有更好的方法吗?
好吧,这取决于您认为更好的方法。它还在一定程度上取决于您的数据源。但由于这里没有这方面的信息,我建议更好的方法是继承。
使 UserPojo
超 class 和 GeneralPojoAllFields
扩展 class。
UserPojo.java:
public class UserPojo {
private String firstName;
private String lastName;
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public UserPojo() {}
public UserPojo(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
}
GeneralPojoAllFields.java:
public class GeneralPojoAllFields extends UserPojo {
private String onlyAdminCanEditField;
public String getOnlyAdminCanEditField() {
return onlyAdminCanEditField;
}
public void setOnlyAdminCanEditField(String onlyAdminCanEditField) {
this.onlyAdminCanEditField = onlyAdminCanEditField;
}
public GeneralPojoAllFields() {}
public GeneralPojoAllFields(String firstName, String lastName, String onlyAdminCanEditField) {
super(firstName, lastName);
this.onlyAdminCanEditField = onlyAdminCanEditField;
}
}
App.java:
public class App {
public static void main(String[] args) {
UserPojo up1 = new UserPojo();
up1.setFirstName("MyFirstName");
up1.setLastName("MyLastName");
GeneralPojoAllFields gpaf1 = new GeneralPojoAllFields();
gpaf1.setFirstName("MyFirstName");
gpaf1.setLastName("MyLastName");
gpaf1.setOnlyAdminCanEditField("yes");
}
}
首先,您的后端应尽可能独立于 UI。所以,UI 中的访问控制是一个很好的设计,但你不应该依赖它。
现在,回到您的问题,是的,您可以使用 SecurityContextHolder
来确定用户是否经常 user/admin。但是,如果可能的话,我建议制作两个控制器,一个用于管理员,一个用于普通用户。在管理控制器上使用 @PreAuthorize
来限制访问。拥有两个独立的控制器将极大地提高代码的可读性。
此外,您可以从两个控制器调用相同的服务 class 方法。由于您已经有两个 POJO classes,您可以在 @RequestBody
中使用它们并让 Spring 为您处理映射。