2017-02-13 1 views
1

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; 
      }); 
     }); 
    }); 
}; 
+0

Le problème est probablement l'endroit où vous avez créé les rôles et l'avez associé à l'utilisateur. –

+0

Probablement, j'ai ajouté le script que j'ai utilisé pour créer les utilisateurs en premier lieu. – Lisa

+0

Je crois qu'ils sont supposés être 'app.models.RoleMapping.USER' au lieu de' app.models.RoleMapping.user' –

Répondre

1

Les principaux problèmes que j'éprouvais tourné autour des éléments suivants:

  1. Utilisation app.models.RoleMapping.USER au lieu de app.models.RoleMapping.user (qui a été modifié dans le code de base dès le début)

  2. Utilisation principalId au lieu de principalID

Comme le reste des listes de contrôle d'accès a été retiré de l'application il y a quelque temps parce qu'elles ne fonctionnaient pas, je ne peux pas dire si elles contribuaient ou non aux problèmes, mais je vais les ajouter au fil du temps en veillant à utiliser les autorisations correctes pour LB3.

0

Il y a une différence entre les rôles et les rôles dynamiques/états (tout le monde $ et authentifié $), tandis que vos rôles sont stockés dans une table pour garder l'association avec tout le monde $ utilisateur et authentifiées $ est juste un état de l'utilisateur. Regardez une table nommée "RoleMapping", si cela est correct. De même, si vous avez un rôle personnalisé, créez un RoleResolver personnalisé.

Il y a vraiment une bonne documentation, et vraiment pas difficile de se lancer dans Bouclage 3.

https://loopback.io/doc/en/lb3/Defining-and-using-roles.html

Cet exemple m'a donné une grande compréhension des rôles en général:

https://github.com/strongloop/loopback-example-access-control/blob/master/server/boot/role-resolver.js

C'est un projet complet, donc vous pouvez y jeter un coup d'œil.

0

c'est la façon dont votre table deux devrait ressembler à:

GET role -->> [table - role] 

[ 
    { 
    "roleId": 1, 
    "name": "admin", 
    "description": "admin", 
    "created": "2016-08-23T16:46:07.572Z", 
    "modified": "2016-08-23T16:46:07.572Z" 
    }, 
    { 
    "roleId": 2, 
    "name": "internal", 
    "description": "internal", 
    "created": "2016-08-23T16:46:07.574Z", 
    "modified": "2016-08-23T16:46:07.574Z" 
    } 
] 


Get Role Mapping [table- user-role]-->> 

[ 
    { 
    "userRoleId": 123, 
    "roleId": 2, //id of role i.e. 1 for admin 
    "principalType": "USER", 
    "principalId": "1234", 
    "created": null, 
    "modified": null 
    }, 
    .. 
    ... 
] 

Alors en regardant votre code, je peux dire que vous n'êtes pas ajouterez RoleId dans la table roleMapping.

d'abord ajouter tous les rôles dans le tableau des rôles,

Maintenant créer utilisateur et ajouter l'entrée de l'utilisateur dans le tableau de correspondance de rôles et affecter un RoleId à elle, voir au code ci-dessus où RoleId 1 indique rôle d'administrateur.

+0

Le champ roleId de ma table RoleMapping est renseigné, mais le champ principalId ne l'est pas. – Lisa

0

En fait, il y a de la syntaxe et de l'erreur logique votre code!

  1. app.models.RoleMapping.USER au lieu de app.models.RoleMapping.user (comme indiqué par @Farid).
  2. Il n'y a pas de type d'accès "DELETE" dans le bouclage acl. vous devez utiliser "*", "READ", "WRITE" ou "EXECUTE" pour la valeur accesType. "WRITE" supporte "créer", "updateAttributes", "upsert" et "destroyById" resoueces. (plus de détails au loopback documentation).

Modifier le acl tel code ci-dessous:

"acls": [ { "accessType": "*", "principalType": "ROLE", "principalId": "$everyone", "permission": "DENY" }, { "accessType": "READ", "principalType": "ROLE", "principalId": "$authenticated", "permission": "ALLOW" }, { "accessType": "*", "principalType": "ROLE", "principalId": "admin", "permission": "ALLOW" }, { "principalType": "ROLE", "principalId": "internal", "permission": "ALLOW", "property": ["create", "updateAttributes", "upsert"] }, { "principalType": "ROLE", "principalId": "bot", "permission": "ALLOW", "property": ["create", "updateAttributes", "upsert"] } ]

  1. Enfin, assurez-vous que vous effectuez le rôle et roleMapping correctement.