Я мог бы помочь. Я использую loopback 3 с расширенной моделью User и потерял доступ к роли администратора.
user. json
{
"name": "user",
"plural": "users",
"base": "User",
"idInjection": false,
"options": {
"validateUpsert": true
},
"properties": {},
"validations": [],
"relations": {
"roles": {
"type": "hasMany",
"model": "Role",
"foreignKey": "principalId",
"through": "RoleMapping"
},
"contents": {
"type": "hasMany",
"model": "content",
"foreignKey": "userId",
"options": {
"nestRemoting": true
}
},
"accessTokens": {
"type": "hasMany",
"model": "AccessToken",
"foreignKey": "userId",
"options": {
"disableInclude": true
}
}
},
"acls": [
{
"accessType": "*",
"principalType": "ROLE",
"principalId": "admin",
"permission": "ALLOW"
}
],
"methods": {}
}
model-config. json
{
"_meta": {
"sources": [
"loopback/common/models",
"loopback/server/models",
"../common/models",
"./models"
],
"mixins": [
"loopback/common/mixins",
"loopback/server/mixins",
"../common/mixins",
"./mixins"
]
},
"User": {
"dataSource": "db",
"public": false,
"options": {
"emailVerificationRequired": true,
"strictObjectIDCoercion": true
}
},
"AccessToken": {
"dataSource": "db",
"public": false,
"relations": {
"user": {
"type": "belongsTo",
"model": "user",
"foreignKey": "userId"
}
}
},
"ACL": {
"dataSource": "db",
"public": false
},
"RoleMapping": {
"dataSource": "db",
"public": false,
"options": {
"strictObjectIDCoercion": true
}
},
"Role": {
"dataSource": "db",
"public": false
},
"attachment": {
"dataSource": "storage",
"public": true
},
"audio": {
"dataSource": "millicentaudio",
"public": true
},
"running": {
"dataSource": "mem",
"public": true
},
"content": {
"dataSource": "db",
"public": true
},
"vocalplaylist": {
"dataSource": "db",
"public": true
},
"backgroundplaylist": {
"dataSource": "db",
"public": true
},
"soundscapeplaylist": {
"dataSource": "db",
"public": true
},
"Email": {
"dataSource": "email"
},
"user": {
"dataSource": "db",
"public": true
}
}
сценарий загрузки
module.exports = function (app) {
var User = app.models.User
var Role = app.models.Role
var RoleMapping = app.models.RoleMapping
var Team = app.models.Team
User.create([
{username: 'name', email: 'email@gmail.com', password: 'password'}
], function(err, users) {
if (err) {
console.log(err)
}
//...
// Create projects, assign project owners and project team members
//...
// Create the admin role
Role.create({
name: 'admin'
}, function(err, role) {
if (err) {
console.log(role)
}
// Make user an admin
role.principals.create({
principalType: RoleMapping.USER,
principalId: users[0].id
}, function(err, principal) {
if (err) {
console.log(principal)
}
})
})
})
}
отладка для показа ролей
loopback:security:role isInRole(): $everyone +0ms
loopback:security:role Custom resolver found for role $everyone +1ms
loopback:security:role isInRole(): $everyone +0ms
loopback:security:role Custom resolver found for role $everyone +0ms
loopback:security:role isInRole(): admin +0ms
loopback:security:role Role found: {"id":"5c98fc80fb2bbc1f9a7f5075","name":"admin","created":"2019-03-25T16:06:24.486Z","modified":"2019-03-25T16:06:24.486Z"} +1ms
loopback:security:role Role mapping found: null +2ms
loopback:security:role isInRole() returns: null +0ms
Показано, что, хотя пользователь и является администратором сопоставления ролей, не может его найти.
Я думаю это может иметь какое-то отношение к отношениям или принципу типа, используемому при создании сопоставления ролей. Я пробовал изменить RoleMapping.USER на 'user' (название модели), используя модель пользователя вместо модели пользователя в скрипте загрузки, обновляя deps, но, похоже, не могу заставить его снова работать.
.... ....
edit .... Я установил еще одну установку, и если для источника данных задано значение mem, все в порядке, если он настроен на использование mongodb admin, проверка не выполняется.
edit .... Установка сопоставления ролей, роли и пользователя (расширенная модель пользователя) для mem в конфигурации модели. json «исправляет», но ищется лучшее решение