Jhipster, запретить пользователю обновлять сущности, созданные другими пользователями - PullRequest
0 голосов
/ 02 октября 2018

Я внедряю Jhipster на своей работе и люблю ее.Меня попросили реализовать проверку безопасности, согласно которой одному пользователю нельзя разрешать редактировать сущность, созданную другим пользователем.Для этого мне нужны две вещи:

  1. Сначала во всех сущностях добавьте отношение ManytoOne с сущностью пользователя.

  2. В Backend вставьте проверку в контроллер при обновлении сущности, чтобы проверить, совпадает ли текущий зарегистрированный пользователь с тем, что хранится в БД.В передней части также та же логика, чтобы показать / скрыть кнопку редактирования.

Я сделал POC для этого, и это работает, но немного некрасиво, проверьте код:

public ResponseEntity<Entry> updateEntry(@RequestBody Entry entry) throws URISyntaxException {
        log.debug("REST request to update Entry : {}", entry);
        if (entry.getId() == null) {
            throw new BadRequestAlertException("Invalid id", ENTITY_NAME, "idnull");
        }

        //here is my logic 
        Optional<Entry> entry_db = entryRepository.findOneWithEagerRelationships(entry.getId());
        if(!entry_db.get().getUser().getId().equals(userService.getUserWithAuthorities().get().getId())) {
            //throw someexception
        }
        //
        Entry result = entryRepository.save(entry);
        return ResponseEntity.ok()
            .headers(HeaderUtil.createEntityUpdateAlert(ENTITY_NAME, entry.getId().toString()))
            .body(result);
    }

Есть ли какой-нибудь лучший или OOTB способ сделать это ???может быть что-то в безопасности весной я не знаю ??

Спасибо за помощь !!

1 Ответ

0 голосов
/ 02 октября 2018

Это задание для контроля доступа на основе выражений Spring Security, в частности вы можете аннотировать свой метод с помощью @PreFilter и пользовательского PermissionEvaluator, который вы реализуете с помощью логики, аналогичной вашей POC.PermissionEvaluator может быть универсальным и применяться к нескольким типам сущностей, если вы определите интерфейс Owned, который моделирует владение с помощью метода, подобного User getOwner(), и который будут реализованы всеми вашими классами сущностей.

См. https://docs.spring.io/spring-security/site/docs/current/reference/html5/#el-access

Аннотированный метод должен быть в сервисе, а не в контроллере ресурсов.

Кроме того, только UserService не поможет вам найти текущего аутентифицированного пользователя, вы должны использовать JHipster's *Сначала 1014 *, а затем ÙserService, если вам нужно больше данных об этом.

...