2014-09-10 5 views
1

Je souhaite avoir un filtre sur le niveau de routage, en vérifiant si l'utilisateur occupe un rôle spécifique.Package Meteor Roles - userIsInRole renvoie toujours false

this.route('gamePage', { 
    path: '/game/:slug/', 
    onBeforeAction: teamFilter, 
    waitOn: function() { return […]; }, 
    data: function() { return Games.findOne({slug: this.params.slug}); } 
}); 

Voici mon filtre:

var teamFilter = function(pause) { 
    if (Meteor.user()) { 
     Meteor.call('checkPermission', this.params.slug, Meteor.userId(), function(error, result) { 
      if (error) { 
       throwError(error.reason, error.details); 
       return null; 
      } 
      console.log(result); // returns always false 
      if (!result) { 
       this.render('noAccess'); 
       pause(); 
      } 
     }); 
    } 
} 

Dans ma collection:

checkPermission: function(gameSlug, userId) { 
     if (serverVar) { // only executed on the server 
      var game = Games.findOne({slug: gameSlug}); 
      if (game) { 
       if (!Roles.userIsInRole(userId, game._id, ['administrator', 'team'])) { 
        return false; 
       } else { 
        return true; 
       } 
      } 
     } 
    } 

Mon premier problème est que Roles.userIsInRole(userId, game._id, ['administrator', 'team'] retourne toujours faux. Au début, j'avais ce code dans mon router.js, mais ensuite j'ai pensé que cela ne fonctionnait pas à cause d'une publication/abonnement manquant, donc j'ai veillé à ce que le code ne fonctionne que sur le serveur. J'ai vérifié la base de données et l'utilisateur est dans le rôle.

Mon deuxième problème est que j'obtiens une exception (Exception in delivering result of invoking 'checkPermission': http://localhost:3000/lib/router.js?77b3b67967715e480a1ce463f3447ec61898e7d5:14:28) à ce stade: this.render('noAccess'); et je ne sais pas pourquoi.

J'ai déjà lu ceci: meteor Roles.userIsInRole() always returning false mais cela n'a pas résolu mon problème.

Toute aide serait grandement appréciée.

+0

Bonjour, vous avez déclaré noAccess comme modèle? –

+0

Oui. Le modèle 'noAccess' est rendu sans Meteor.method. – user3475602

Répondre

1

Dans teamFilter crochet vous appelez Meteor.method checkPermission qui fonctionne et de manière asynchrone OnBeforeAction exécution synchrone s'attend (pas de callbacks). C'est pourquoi vous recevez toujours faux.

Une autre chose est que vous utilisez Roles.userIsInRole correctement:

devrait être:

Roles.userIsInRole(this.userId, ['view-secrets','admin'], group) 

Dans ce cas, je voudrais vérifier les rôles sur le côté client:

Roles.userIsInRole(userId, ['administrator', 'team']) 

Probablement vous êtes inquiet à propos de la sécurité avec cette solution. Je ne pense pas que vous devriez. Quel est le plus important est de données et de données est protégé par la fonction de publication qui devrait vérifier les rôles.

Veuillez noter que tous les modèles sont accessibles au client.

+0

Merci pour le conseil. J'ai refacturé le 'teamFilter' afin de vérifier les permissions du côté client. Maintenant, je ne reçois plus l'exception, mais 'Roles.userIsInRole' renvoie toujours' false'. Est-il nécessaire de publier 'Meteor.roles'? – user3475602

+0

Ma plus grande préoccupation est que l'utilisateur n'a pas été ajouté avec succès au rôle, car 'console.log (Roles.getRolesForUser (Users.findOne ({nom d'utilisateur: administrateur})));' juste après avoir ajouté l'utilisateur au rôle (côté serveur) renvoie un ensemble vide. – user3475602

+0

Avez-vous ajouté l'utilisateur aux rôles correctement: 'Rôles.addUsersToRoles (id, ["admin"]) ' –

0

Vous pouvez ajouter des rôles à l'utilisateur uniquement sur le serveur pour que vous puissiez utiliser Meteor.call ({}); check here méthode du client à la méthode d'appel sur main.js du serveur et vous pouvez vérifier après cette méthode appel si le rôle est ajouté dans la collection des utilisateurs en utilisant meteor mongo et db.users.find ({}). Pretty() et voir si les rôles array est ajouté l'utilisateur de ce usedId alors vous pouvez utiliser la fonction Roles.userIsInRole() n'importe où sur le client pour vérifier le rôle des utilisateurs connectés.

Questions connexes