Выбор того, что pojo использовать в зависимости от роли пользователя в запросе на редактирование - PullRequest
0 голосов
/ 01 мая 2018

Поэтому мне интересно, как лучше всего обработать запрос на редактирование на основе роли пользователя.

Скажем, у меня есть следующее 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, которое администратор сможет использовать, и в конечном итоге оно будет сопоставлено с классом сущностей для сохранения в базе данных. Тем не менее, если у нас есть обычный пользователь, который хочет редактировать его и гипотетически он не ограничен в пользовательском интерфейсе, этот дизайн будет работать? В настоящее время я думаю, что у меня есть пользователь pojo, например, так:

public class UserPojo {    
    private String firstName;
    private String lastName;
}

После отображения запроса мы проверяем, является ли пользователь обычным пользователем или администратором. Если это обычный пользователь, мы просто сопоставляем GeneralPojoAllFields с UserPojo, и он не будет отображаться на onlyAdminCanEditField, и продолжаем оттуда.

Есть ли лучший способ сделать это?

Ответы [ 2 ]

0 голосов
/ 01 мая 2018

Во-первых, ваш бэкэнд должен быть максимально независимым от пользовательского интерфейса. Итак, контроль доступа в пользовательском интерфейсе - это хорошо иметь дизайн, но вы не должны зависеть от него.

Теперь, возвращаясь к вашему вопросу, да, вы можете использовать SecurityContextHolder, чтобы узнать, является ли пользователь обычным пользователем / администратором. Однако, если это возможно, я бы предложил создать два контроллера, один для администратора и один для обычного пользователя. Используйте @PreAuthorize на контроллере администратора для ограничения доступа. Наличие двух отдельных контроллеров значительно повысит читабельность вашего кода.

Кроме того, вы можете вызывать один и тот же метод класса обслуживания с обоих контроллеров. А поскольку у вас уже есть два класса POJO, вы можете использовать их в @RequestBody и позволить Spring позаботиться о сопоставлениях для вас.

0 голосов
/ 01 мая 2018

Ну, это зависит от того, что вы думаете, будет лучше. Это также немного зависит от вашего источника данных. Но поскольку здесь нет информации об этом, я бы предположил, что лучший способ сделать это - наследовать.

Сделать UserPojo суперклассом и GeneralPojoAllFields расширить этот класс.

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");
    }
}
...