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.
Bonjour, vous avez déclaré noAccess comme modèle? –
Oui. Le modèle 'noAccess' est rendu sans Meteor.method. – user3475602