Ciao a tutti,
sto usando Yii2 da alcuni mesi per un progetto aziendale.
In questo progetto ci sono vari ruoli (superadmin, admin, referente, utente base , utente ultra base,… ).
Ho approcciato al problema di gestire le operazioni che un utente può fare tramite la Yii RBAC e il modulo yii2-admin che mi ha permesso di gestire anche le rotte della applicazione (discutibile, ma davvero apprezzato).
A questo punto ho una applicazione che risponde positivamente ai permessi, tutto fantastico e soprattutto tutto molto facile tramite le behaviours nei controller e l’authManager di Yii.
Quello che mi manca è come posso gestire alcune condizioni di filtraggio sui model in base al ruolo, evitando una cascata di if, cerco di spiegarmi meglio con alcuni esempi facili:
Siamo nel contesto di RUOLI - UTENTI - SEDI, dove un utente può essere associato a più sedi e può amministrarle.
Esempio 1 - Elenco di record
Utente1 è di ruolo REFERENTE, quindi ha la possibilità di aggiungere (con una tabella MM) N SEDI al suo profilo.
Alla rotta /sedi Utente1 vede tutte le sedi associate a al suo profilo(immaginiamo 5).
Utente2 è ADMIN e alla rotta /sedi vede sempre tutte le SEDI in stato attivo (50).
Utente3 è SUPERADMIN e alla rotta /sedi vede sempre tutte le SEDI in qualsiasi stato(75).
Esempio 2 - Elenco di record in relazione hasMany/hasOne
Utente1, Utente2 e Utente3 (con i ruoli impostati nell’esempio precedente) possono pubblicare comunicazioni (una semplice notizia), indicando per quali sedi verranno pubblicate.
Utente1 (REFERENTE) vede le sedi associate al suo profilo (5);
Utente2 (ADMIN) vede tutte le sedi in stato attivo (50);
Utente3 (SUPERADMIN) vede tutte le sedi in qualsiasi stato (75);
Mi piacerebbe capire qual’è il miglior modo per gestire questa casistica di query con filtraggi in base al ruolo:
-
Evitare di inserire una cascata di if in base al ruolo dell’utente
-
Capire se Yii fornisce qualcosa in merito (tramite la function init?)
-
Rispettare le Best Practise
Come avete approcciato questo tipo di problematica? Non chiedo una soluzione (che sicuramente si trovano), ma un approccio alla problematica.
Grazie mille in anticipo!!
Simo