Gerarchia Utenti

Ciao a tutti,

ho una domanda: avete mai gestito un progetto dove avete implementato la visibilità sui record in funzione di una gerarchia utenti?

mi spiego meglio quello che ho in mente: clienti/ordini/appuntamenti/documenti … visibili al proprietario (colui che ha creato il record) ed al suo superiore (responsabile d’area per intenderci meglio); due figure che, con gerarchia sottostante, vedono solo i loro dipendenti (due responsabili d’area vedono solo i loro sottoposti).

E’ da un po’ che ci lavoro ma non trovo soluzione se non lavorando sul DB creando una function con un cursore.

Avete idee per poterlo gestire diversamente? volevo usare php (non ho ancora completa dimestichezza con questo linguaggio).

Grazie in anticipo.

un paio di anni fa ho realizzato una cosa simile: utilizzando RBAC in yii ho risolto molto bene il problema http://www.yiiframework.com/wiki/136/getting-to-understand-hierarchical-rbac-scheme/

come interfaccia utilizzai questo modulo http://www.yiiframework.com/extension/auth

l’unica cosa più complicata fu scrivere il codice per ricreare le gerarchie (X è un sottoposto di Y? ecc.)

markux grazie mille per la risposta, non la vedo semplicissima (almeno per me), continuo ad usare la function creata a DB che al momento mi sta dando soddisfazioni

:lol: :lol: :lol: :lol:

Per avere un sistema di ACL avanzato, come viene chiamato questo tipo di sistema nei maggiori CMS Open Source, la soluzione migliore secondo me è installare queste due estensioni:

Yii2 User

Yii2 RBAC

La prima è un’estensione per la gestione degli utenti e la seconda per quella dei permessi.

Pur essendo in versioni non ancora stabili funzionano piuttosto bene e sono fatti apposta dallo stesso utente per interoperare.

grazie mille, provo ad approfondire Yii2 User, RBAC già lo uso.

ci lavoro stay tuned…

grazie ancora

Anche io ho lo stesso problema…

… ho aggiunto un campo ‘refer’ alla tabella ‘user’ del database e al modello ‘User’ …

… tramite rbac verifico se l’utente è loggato e se può aprire la pagina di registrazione di un nuovo utente …

… nel form di registrazione sempre tramite rbac verifico se l’utente ha o no il permesso per creare nuovi utenti, in caso di esito positivo…

… ho modificato il model della form di registrazione in modo tale che salvi il nuovo utente con l’id dell’utente loggato nel campo refer.

E fin qui va tutto alla grande… ed è stato molto semplice. Quindi sono in grado di registrare un ipotetico agente, farlo loggare, fargli registrare un nuovo utente semplice, e salvare l’id dell’agente nel campo ‘refer’ nei dati di quest’ultimo.

Il problema che ho adesso, è nel rendere visibile all’ agente… solo i suoi utenti. Il problema mi si crea perchè voglio implementare il ‘filtro’ direttamente nel modello, e non nella gridview o altro. Stavo cercando qualche metodo del modello sul quale fare l’override, ma non ne vengo a capo.

Il filtro lo implementi giustamente nel model (meglio nella search class del model). Poi dal controller tramite rbac verifichi se l’utente ha i privilegi o meno chiamando il filtro apposito. Se byAgent e ByAll sono i filtri che hai creato, fai una cosa del genere:


$searchModel = new ModelSearch();

if (Yii::$app->user->can('AGENT'))

    $dataProvider = $searchModel->byAgent();

else 

    $dataProvider = $searchModel->byAll();

return $this->render('index', [

    'searchModel' => $searchModel,

    'dataProvider' => $dataProvider,

]);

Perfetto, me ne sono tirato fuori con un paio di modifiche…

Ho aggiunto una nuova funzione nella UserQuery (che estende ActiveQuery):




    public function byRefer($refer)

    {

        $this->andWhere(['refer' => $refer]);

        return $this;

    }

Dopo ho modificato la UserSearch (che estende User) copiando la funzione originale Search in SearchByRefer con il parametro aggiuntivo Refer sul quale passare l’id dell’utente attualmente loggato:




   public function search($params)

    {

        $query = User::find();


        $dataProvider = new ActiveDataProvider([

            'query' => $query,

        ]);


        ......


        return $dataProvider;

    }


    public function searchByRefer($params, $refer)

    {

        $query = User::find()->byRefer($refer);


        $dataProvider = new ActiveDataProvider([

            'query' => $query,

        ]);


        ......


        return $dataProvider;

    }



E infine nel controller come suggerito da Ventoh, ho modificato il $dataProvider:




    public function actionIndex()

    {

        $searchModel = new UserSearch();

        //$dataProvider = $searchModel->search(Yii::$app->request->queryParams);

        $dataProvider = $searchModel->searchByRefer(Yii::$app->request->queryParams, \Yii::$app->user->identity->id);


        return $this->render('index', [

            'searchModel' => $searchModel,

            'dataProvider' => $dataProvider,

        ]);

    }



Non sò se sia la soluzione più corretta, magari tralascio qualcosa premettendo che sono un neofita di Yii. Se dovete sgridarmi, fate pure :lol:

In ogni caso, grazie mille del supporto :))

Piccolo edit… ho aggiunto il controllo RBAC per visualizzare o meno tutti gli utenti




    public function actionIndex()

    {

        $searchModel = new UserSearch();


        if (Yii::$app->user->can('handleAllUsers')) {

            $dataProvider = $searchModel->search(Yii::$app->request->queryParams);

        } else {

            $dataProvider = $searchModel->searchByRefer(Yii::$app->request->queryParams, \Yii::$app->user->identity->id);

        }


        return $this->render('index', [

            'searchModel' => $searchModel,

            'dataProvider' => $dataProvider,

        ]);

    }