Gestire i filtraggi sulle query in base al/ai ruolo/i dell'utente

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

Ciao a tutti!

Che ne pensate di questa:




	

class User extends \yii\db\ActiveRecord

{

    public static function active($query)

    {

        $query->andWhere('status = 1');

    }

}




$model = User::find()

	->active()

	->all();




Fonte : http://www.bsourcecode.com/yiiframework2/select-query-advanced/

Leggendo la documentazione di Yii, il concetto di scope che era previsto nel 1.1 non è più previsto nel 2.

http://www.yiiframework.com/doc-2.0/guide-db-active-record.html#customizing-query-classes

Avete trovato altre soluzioni?