J'utilise Loopback3. Je rencontre un problème avec mes rôles ACL et je ne suis pas sûr de ce que j'ai fait de mal. Je souhaite que les utilisateurs dans des rôles spécifiques puissent écrire des données sur le noeud final et, pour une raison quelconque, l'utilisateur que j'ai configuré (qui est dans l'un de ces rôles) ne peut pas écrire. Je reçois une erreur Authorization Required.Loopback ACL "Autorisation requise"
J'ai 4 rôles:
- admin
- interne
- externe
- bot
Pour ce point final, tous les utilisateurs authentifiés peuvent lire les données, mais seulement admin, Les utilisateurs internes et bot peuvent écrire des données, et seuls les utilisateurs administrateurs peuvent supprimer des données.
Voilà comment j'ai mes ACLs définis:
"acls": [
{
"accessType": "*",
"principalType": "ROLE",
"principalId": "$everyone",
"permission": "DENY"
},
{
"accessType": "READ",
"principalType": "ROLE",
"principalId": "$authenticated",
"permission": "ALLOW"
},
{
"accessType": "WRITE",
"principalType": "ROLE",
"principalId": "admin",
"permission": "ALLOW"
},
{
"accessType": "WRITE",
"principalType": "ROLE",
"principalId": "internal",
"permission": "ALLOW"
},
{
"accessType": "WRITE",
"principalType": "ROLE",
"principalId": "bot",
"permission": "ALLOW"
},
{
"accessType": "DELETE",
"principalType": "ROLE",
"principalId": "admin",
"permission": "ALLOW"
}
],
J'ai deux utilisateurs mis en place, on est un bot et un est un administrateur. Lorsque je fais une demande POST à l'API pour l'un ou l'autre des utilisateurs, j'obtiens l'erreur 'Authorization Required', même quand je le fais depuis l'interface de l'explorateur. Je peux faire un GET sans problème, mais un POST obtient un échec.
Si je supprime tous les acl "WRITE" et les remplace par ceci, faire un POST fonctionne.
{
"accessType": "WRITE",
"principalType": "ROLE",
"principalId": "$authenticated",
"permission": "ALLOW"
},
Alors, je peux pour y arriver, mais je ne sais pas pourquoi mes rôles personnalisés sont défaillants. Editer: Voici comment j'ai créé les utilisateurs, car je n'ai pas encore d'interface construite pour l'instant.
module.exports = function (app) {
let today = new Date();
let admin = {
name: 'admin',
description: 'admin users',
created: today.toJSON(),
modified: today.toJSON()
};
let internal = {
name: 'internal',
description: 'Internal users',
created: today.toJSON(),
modified: today.toJSON()
};
let external = {
name: 'external',
description: 'external users',
created: today.toJSON(),
modified: today.toJSON()
};
let bot = {
name: 'bot',
description: 'robots',
created: today.toJSON(),
modified: today.toJSON()
};
let model = app.models.user;
model.create([
{username: 'bot', email: '[email protected]', password: 'test123'},
{username: 'admin', email: '[email protected]', password: 'test123'},
{username: 'iAdmin', email: '[email protected]', password: 'test123'},
{username: 'eUser', email: '[email protected]', password: 'test123'},
], function(err, users) {
if (err) throw err;
app.models.Role.create(bot, function (err, botRole) {
if (err) throw err;
botRole.principals.create({principalType: app.models.RoleMapping.user, principalID: users[0].id}, function(err, principal) {
if (err) throw err;
});
});
app.models.Role.create(admin, function (err, adminRole) {
if (err) throw err;
adminRole.principals.create({principalType: app.models.RoleMapping.user, PrincipalID: users[1].id}, function(err, principal) {
if (err) throw err;
});
});
app.models.Role.create(admin, function (err, internalRole) {
if (err) throw err;
internalRole.principals.create({principalType: app.models.RoleMapping.user, PrincipalID: users[2].id}, function(err, principal) {
if (err) throw err;
});
});
app.models.Role.create(external, function (err, externalRole) {
if (err) throw err;
externalRole.principals.create({principalType: app.models.RoleMapping.user, PrincipalID: users[3].id}, function(err, principal) {
if (err) throw err;
});
});
});
};
Le problème est probablement l'endroit où vous avez créé les rôles et l'avez associé à l'utilisateur. –
Probablement, j'ai ajouté le script que j'ai utilisé pour créer les utilisateurs en premier lieu. – Lisa
Je crois qu'ils sont supposés être 'app.models.RoleMapping.USER' au lieu de' app.models.RoleMapping.user' –