2017-02-16 18 views
0

Я новичок в loopback. Я пытаюсь научиться & реализовать ACL.Loopback: Несколько владельцев для модели с собственными отношениями

У меня есть одна «PersistedModel» с именем «Страница». Я использую две разные модели: «Сотрудник» и «Клиент», как на основе встроенной модели «Пользователь».

Отношения: Страница принадлежит «Сотруднику», а также «Заказчику». Оба должны быть владельцами страницы. Клиент & Сотрудник имеет как много страниц. Итак, я добавил следующие в отношениях:

"customer": { 
     "type": "belongsTo", 
     "model": "Customer", 
     "foreignKey": "customerId" 
    }, 
    "employee": { 
     "type": "belongsTo", 
     "model": "Employee", 
     "foreignKey": "employeeId" 
    } 

ACL: Я хочу 'WRITE' разрешение только для владельцев. Итак, я добавил следующее в acls:

{ 
     "accessType": "WRITE", 
     "principalType": "ROLE", 
     "principalId": "$owner", 
     "permission": "ALLOW" 
    } 

При попытке запроса патча запрос владельца клиента выполняется успешно. Но запрос владельца-владельца получает «Ошибка авторизации».

Что я здесь делаю неправильно?

+0

Вы проверили, что в базе данных есть правильные данные для внешних ключей? –

+0

@EbrahimPasbani Да. Я проверил его. –

ответ

2

LoopBack документации обновляется в последнее время и они добавили эти две строк в извещении: (http://loopback.io/doc/en/lb3/Using-built-in-models.html#user-model)

LoopBack делает не поддерживают несколько моделей на основе модели User в одном приложении. То есть вы не можете иметь более одной модели, полученной из встроенной модели User в одном приложении.

В принципе, я не должен был создавать две разные модели, основанные на модели «Пользователь». :(

0

Loopback только чеки для одного владельца отношение here.

Для два владельца вы должны написать свою собственную роль и зарегистрироваться на role resolver

+1

Благодарим вас за ответ. Я постараюсь с помощью распознавателя ролей. –

0

Как сказал шлейфу, вы должны один расширить модель от модели пользователя, определить роль (от модели ролей), и назначить роль любого пользователя или участник с помощью модели RoleMapping (это встроенный в модели).

например:

  1. Расширение модели от модели пользователя и назван MyUser
  2. Создать 'Клиент' и 'Сотрудник' роль
  3. Добавить соотношение:..

    "customer": { "type": "belongsTo", "model": "MyUser", "foreignKey": "customerId" }, "employee": { "type": "belongsTo", "model": "MyUser", "foreignKey": "employeeId" }

  4. в MyUser модели, добавьте следующий ACL:

    { "accessType": "WRITE", "principalType": "ROLE", "principalId": "Customer", "permission": "ALLOW" }, { "accessType": "WRITE", "principalType": "ROLE", "principalId": "Employee", "permission": "ALLOW" }

+0

Благодарим вас за ответ. Но в этом решении любой «Клиент» сможет редактировать любую запись. $ owner позволяет использовать только идентификатор пользователя, связанный с конкретной записью. –

+0

Правильно! вы можете [https://loopback.io/doc/en/lb3/Defining-and-using-roles.html#dynamic-roles] ролевой распознаватель или настраиваемый удаленный метод и разрешить модификацию, если аутентифицированный пользователь является владельцем записи. – javadib

0

Согласно this commit (шлейфом 3.13.0, опубликованном 28 сентября 2017 года), вы можете установить {ownerRelations: true} в