2016-01-18 4 views
1

Я использую loopback framework.RoleMapping.USER или RoleMapping.ROLE & ACL

Мне не очень понятно, когда использовать RoleMapping со статическими ролями и ACL, также после прочтения документации here и here.

У меня есть сценарий загрузки, в который я вставляю некоторые основные статические роли в мое приложение (admin, approver, validator и т. Д.), И я использую эти роли в ACL.

Кажется мне, что, когда я объявляю о роли пользователя, я должен использовать RoleMapping.USER:

const approver = yield app.models.User.create({ 
    email: '[email protected]', 
    password: 'secret-apprpver-123', 
    status: 'active', 
    emailVerified: true 
}); 

const roleApprover = yield app.models.Role.findOne({ 
    where: {name: 'approver'} 
}); 

yield app.models.RoleMapping.create({ 
    principalId: approver.id, 
    principalType: app.models.RoleMapping.USER, 
    roleId: roleApprover.id 
}); 

Хотя в ACL я должен использовать RoleMapping.ROLE:

{ 
    "principalType": "ROLE", 

    "accessType": "EXECUTE", 
    "principalId": "approver", 
    "permission": "ALLOW", 
    "property": "setApprove" 
} 

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

Есть ли кто-нибудь, кто может объяснить мне, как это сделать?

+1

В первом блоке кода вы добавляете пользователя к роли, во втором блоке (ACL config) вы позволяете роли принимать действие над моделью. Эти два действия работают в унисон, чтобы обеспечить авторизацию и аутентификацию соответственно. Какую часть вы не понимаете точно? – jakerella

+0

при первом взгляде я бы использовал тот же самый 'mainType' для обоих .. ваши объяснения кажутся хорошими, но можете ли вы немного расширить его? – nkint

ответ

2

(просто положить это в ответ ...)

В первом блоке кода вы создаете пользователя и роль, а затем добавить пользователя в этой роли. Во втором блоке (конфигурация модели ACL) вы разрешаете этой роли (и любому в ней) принимать действие над моделью (в частности, в этом случае выполняется метод setApprove()). Эти два действия работают в унисон, чтобы обеспечить авторизацию и аутентификацию соответственно.

Чтобы ответить на следующий комментарий, principalType в конфигурации конфигурации ACL - "ROLE", потому что вы хотите, чтобы кто-либо из этой роли мог принять это действие. Если вы вместо этого сделали principalType"USER", вам нужно будет изменить principalId на новый идентификатор пользователя, и вы будете разрешать только одному пользователю (независимо от того, кто в роли) принять это действие.