Dove Metto Una Funzione "di Sistema"

Eccoci!

Ho scritto una funzione che controlla il ruolo di un utente, non di quello loggato ma di un qualsiasi utente passato come parametro.

Prima l’avevo messa nella classe WebUser ma riflettendo non è il posto adatto in quanto la funzione non serve per determinare qualcosa dell’utente loggato ma di un utente generico…

Voi dove la mettereste?

Il ruolo dell’utente è una responsabilità della classe utente. La metterei proprio nel WebUser. O hai un utente, e la funzione ti serve, oppure non hai un utente, e della funzione non ne hai più bisogno. In ogni caso, il tuo metodo risolve una responsabilità questa responsabilità è di una sola classe.

Si, riripensandoci l’ho poi lasciata nel webuser definendola static per usarla in vari contesti.

Mi sfugge il perché del fatto che sia static. Nel senso: con $this otterresti immediatamente Yii::app()->user.

"CWebUser represents the persistent state for a Web application user."

In realtà questa funziona non controlla il ruolo dell’utente loggato quindi penso sia meglio metterla altrove e poterla richiamare staticamente senza istanziare alcuna classe.

Fai come credi, ma se l’utente non è loggato, sai già che quell’utente non ha alcun tipo di permesso. Anzi, non ti serve del codice che ti dice se l’utente è loggato o meno: Yii::app()->user->isGuest è più che sufficiente. Per tutto il resto, è la classe che gestisce l’utente che fa quel che ti può servire.

Non hai capito, come ho già detto, quella funzione non mi dice i ruoli dell’utente loggato ma di un qualsiasi utente.

Potrei usarla in qualsiasi momento per sapere il ruolo di un utente con una cosa tipo


Classe::CheckUserRole('pippo', 'amministratore');

per questo motivo non ho individuato il posto più adatto!

Nel model relativo alla tabella degli utenti?

Ora si che sei stato chiaro.

Yii usa un componente per gestire i permess, si chiama authManager:


Yii::app()->authManager->checkAccess()

Io ti consiglio di dare una occhiata a come funziona l’RBAC di Yii e provare ad usarlo, usare e’ meglio che scrivere, di solito si risparmia tempo.

Per le funzioni di sistema io preferisco fare dei componenti:


class cammello extends CApplicationComponent

{

   public function cammina()

   public function sbava()

}




Nel config main, nella sezione component configuri:


components=>array(

  'cammello'=>array(

      'class'=>'application.extensions.animali.cammello'

   )

)

Cosi’ puoi far sbavare il cammello usando:


Yii::app()->cammello->sbava()

Questo metodo sembra prolisso, ma hai i seguenti vantaggi:

  • Usi la stessa istanza di cammello in tutta l’applicazione

  • Puoi configurare i parametri nel config mail


components=>array(

  'cammello'=>array(

      'class'=>'application.extensions.animali.cammello',

      'sesso'=>'femmina', 

)

RBAC lo conosco ma non mi piace e per situazioni dove i ruoli sono pochi e fissi preferisco una cosa gestita da me.

Inoltre su questo progetto le business rules sono piuttosto sofisticate e con RBAC non ero molto soddisfatto.

In realtà quello che mi serve non è proprio per i ruoli, ho usato i ruoli solo per fare un esempio del contesto.

Mentre per le funzioni di sistema mi hai dato un esempio molto chiaro e molto utile!

In effetti le bizrules non sempre si riescono ad usare.

Io uso sempre e solo rbac, se devo fare dei controlli custom li scrivo direttamente nelle action nella forma:


if (non sei autorizzato) throw exception.

Oppure ancora meglio nella afterFind dei model, per esempio;


public function afterFind()

{

  if ($this->user_id !== Yii::app()->user->id)

      throw new Exception;

}

Questo sistema (completamente indipendente da rbac) si usa per esempio per evitare che un utente acceda a record di un altro utente.