根据编辑请求中的用户角色选择要使用的 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 为您处理映射。