Как запретить пользователям редактировать один и тот же элемент во внешнем интерфейсе, если он уже отредактирован - PullRequest
0 голосов
/ 01 января 2019

У меня есть приложение, где пользователи могут отображать и редактировать элементы в моей базе данных через веб-сайт.Теперь, чтобы быть уверенным, что не возникнет никаких проблем, когда два пользователя изменят один и тот же элемент, я бы хотел, чтобы они не делали этого.Это означает, что первый пользователь, имеющий доступ к элементу, может редактировать его, а остальные могут только просматривать элемент.Но, к сожалению, я не имею понятия, как правильно это реализовать.Давайте сначала посмотрим на настройку:

У меня есть контроллер, который может выглядеть следующим образом:

@RestController
@RequestMapping(value="/item")
public class ItemController {

    @Autowired 
    ItemService itemService;

    @GetMapping(value="/getItem/{item_id}")
    public ResponseEntity getItem(@PathVariable String item_id) {
        this.itemService.getItemById(item_id);
        return ResponseEntity.ok(HttpStatus.OK);
    }

}

Теперь, когда вызывается getItem, я знаю, что пользователь получил доступ к элементус данным item_id от внешнего интерфейса.Таким образом, я мог бы просто создать список «заблокированных» элементов в моем Controller, которые содержат элементы, и проверить, вызван ли метод getItem: «Если item_id находится в списке, вернуть Access denied и перенаправить накомпонент "только для просмотра", иначе ok ".Но это, кажется, весьма обходной путь, и я не могу себе представить, что именно так это и должно быть решено.Также мне нужно каким-то образом надежно удалить элементы из списка.

Существует ли шаблон или что-то подобное, показывающее, как это нужно решить?

Я использую Spring-Boot и Angular 7, если это поможет.

1 Ответ

0 голосов
/ 01 января 2019

Это особенно сложно сделать по многим причинам, включая те, которые вы упомянули.Что если вы заблокируете строку, а пользователь с блокировкой просто закроет браузер?Тогда ряд заблокирован навсегда.Или вы запускаете ночную процедуру для очистки всех блокировок, но тогда ни один пользователь не может получить доступ к записи до следующего дня и т. Д.

В общем, это было проблемой, так как базы данных были изобретены, так что вы могли быдумаю, что решение было бы найдено, но не то, что я знаю.Обычно я пытаюсь порекомендовать способы минимизировать это, используя не бизнес-процессы, а бизнес-процессы.

В программном обеспечении вместо блокировки можно рассмотреть возможность предоставления способов дальнейшей минимизации воздействия нескольких обновлений путем сохранения метки времени.Когда пользователь получает строку и затем публикует ее для обновления, система проверяет, что отметка времени остается той же.Если так, это позволяет обновление.Если нет, ему придется либо отклонить изменение, либо проявить смекалку и попытаться определить, насколько его данные отличаются от текущих данных, и объединить значения настолько, насколько это возможно.

Подробнее об этом можно прочитать здесь: Оптимистическая или пессимистическая блокировка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...