nonzod
(Nicola)
September 21, 2012, 10:01am
1
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?
sensorario
(Sensorario)
September 21, 2012, 10:58am
2
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.
nonzod
(Nicola)
September 21, 2012, 11:20am
3
Si, riripensandoci l’ho poi lasciata nel webuser definendola static per usarla in vari contesti.
sensorario
(Sensorario)
September 21, 2012, 1:08pm
4
Mi sfugge il perché del fatto che sia static. Nel senso: con $this otterresti immediatamente Yii::app()->user.
nonzod
(Nicola)
September 21, 2012, 3:03pm
5
"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.
sensorario
(Sensorario)
September 22, 2012, 9:50am
6
"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.
nonzod
(Nicola)
September 23, 2012, 2:23pm
7
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!
ekerazha
(Ekerazha)
September 23, 2012, 4:36pm
8
Nel model relativo alla tabella degli utenti?
sensorario
(Sensorario)
September 23, 2012, 7:45pm
9
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!
Ora si che sei stato chiaro.
zaccaria
(Matteo Falsitta)
September 25, 2012, 9:23am
10
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:
components=>array(
'cammello'=>array(
'class'=>'application.extensions.animali.cammello',
'sesso'=>'femmina',
)
nonzod
(Nicola)
September 25, 2012, 11:58am
11
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!
zaccaria
(Matteo Falsitta)
September 25, 2012, 12:46pm
12
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.