2015-05-27 11 views
7

Sto utilizzando il pacchetto meteorologico ian:accounts-ui-bootstrap-3 per gli account e alanning:roles per l'assegnazione dei ruoli.Meteor: come assegnare diversi ruoli agli utenti durante il processo di registrazione

Sul modulo di iscrizione sono disponibili due opzioni per uno Dottore e uno per Advisor. Voglio assegnare l'opzione selezionata come un ruolo per quell'utente. Qualcuno può farmi sapere come farlo?

Ho appena iniziato a imparare la meteora e non ne so molto del suo flusso. Posso assegnare i ruoli ad un utente se creo l'utente manualmente in questo modo:

var adminUser = Meteor.users.findOne({roles:{$in:["admin"]}}); 

if(!adminUser){ 

    adminUser = Accounts.createUser({ 
     email: "[email protected]", 
     password: "admin", 
     profile: { name: "admin" } 
    }); 
    Roles.addUsersToRoles(adminUser, [ROLES.Admin]); 
} 

Ma voglio assegnare un rotolo automaticamente come un utente si iscrive e selezionare una delle opzioni e che l'opzione deve essere assegnato come il suo ruolo.

+0

solo una parola sull'utilizzo del profilo. sembra che non sia una buona idea: vedi "Non usare il profilo" in https://guide.meteor.com/accounts.html – ApriOri

risposta

4

Non si dovrebbe avere bisogno di un trucco per questo. Invece di usare Accounts.onCreateUser puoi farlo con il seguente hook sulla collezione Meteor.users. Qualcosa in linea con le seguenti linee dovrebbe funzionare:

Meteor.users.after.insert(function (userId, doc) { 
    if (doc.profile.type === "doctor") { 
     Roles.addUsersToRoles(doc._id, [ROLES.Doctor]) 
    } else if (doc.profile.type === "advisor") { 
     Roles.addUsersToRoles(doc._id, [ROLES.Advisor]) 
    } 
}); 
+0

Grazie! Per me va bene! – ignacy130

+3

Forse è importante notare che per questo è necessario 'meteor add matb33: collection-hooks'. –

+0

@Tom Van Schoor. Buon punto! –

-1

è possibile utilizzare il gancio Accounts.onCreateUser per gestirlo.

Si prega di tenere presente che il codice di seguito è abbastanza insicuro e si vorrebbe probabilmente fare più controlli in anticipo, altrimenti chiunque può assegnarsi l'amministrazione. (da documenti):

le opzioni possono provenire da un client non attendibile, quindi assicurarsi di convalidare qualsiasi valore letto da esso.

Accounts.onCreateUser(function (options, user) { 
    user.profile = options.profile || {}; 
    if (_.has(options, 'role')) { 
    Roles.addUserToRoles(user._id, options.role); 
    } 
    return user; 
}); 
+0

grazie per il tuo aiuto. Ho provato il tuo codice ma non ho il "ruolo" nelle "opzioni". Ho fatto console.log (opzioni) e non c'era nessun campo ruoli lì e questo potrebbe essere il motivo per cui non si aggiungono ruoli. Su mongo quando faccio "db.users.find()" non mostra nemmeno il campo dei ruoli. Ma quando ho usato "Accounts.onLogin" mentre condivido il mio codice sotto il suo perfetto funzionamento. Ma voglio che funzioni su "Accounts.onCreateUser". –

+3

'Roles.addUserToRoles' non funzionerà in' onCreateUser' perché il nuovo utente non è ancora stato aggiunto alla collezione di Meteor.users, anche se c'è un 'user._id' che sarà usato per farlo. – Shwaydogg

-1

Grazie per la risposta. Ho provato ma non funziona per me.

Ho usato il gancio Accounts.onLogin per gestirlo. Qui di seguito il codice funziona per me:

Accounts.onLogin(function (info) { 
    var user = info.user; 
    if(user.profile.type === "doctor"){ 
     Roles.addUsersToRoles(user, [ROLES.Doctor]) 
    } 
    else 
     if(user.profile.type === "advisor"){ 
     Roles.addUsersToRoles(user, [ROLES.Advisor]) 
     } 
    return user; 
    }); 
+0

Questo è piuttosto inefficiente perché stai facendo almeno una query di database aggiuntiva per accesso. Qual è stato il problema con la risposta di @ corvid? –

+0

Sì, hai ragione. Ho provato il codice di @ corvid ma non so perché non ha funzionato per me. Dopo aver eseguito il suo codice non ricevevo alcun ruolo assegnato all'utente. –

1

per andare in giro dover controllare il login ogni volta che è possibile impostare direttamente i ruoli dell'utente oggetto invece di utilizzare l'API ruoli.

Un hack? Sì, probabilmente devi assicurarti che i ruoli siano già stati aggiunti ai ruoli ... non so se c'è ancora qualcos'altro.

if(Meteor.isServer){ 
    Accounts.onCreateUser(function(options, user){ 
    if(options.roles){ 
     _.set(user, 'roles.__global_roles__', ['coach', options.roles]); 
    } 
    return user; 
    }); 
} 

Nota: _.set è un metodo lodash non in underscorejs.

Non c'è abbastanza soluzione perché:

  1. Non c'è lato server meteora di richiamata dopo completare la creazione conto.
    • In onCreateUser l'utente non è stato aggiunto alla raccolta.
    • Accounts.createUser La funzione di richiamata è attualmente disponibile solo per il client. È quindi possibile utilizzare un metodo da tale callback, ma sarebbe insicuro affidarsi a tale metodo.
  2. Il pacchetto dei ruoli sembra catturare l'utente dalla raccolta e in onCreateUser non è ancora lì.
Problemi correlati