micko85
(Mickop)
November 16, 2011, 8:29pm
1
Ciao a tutti.
Ho iniziato da poco a studiarmi un po’ il framework.
Non mi è chiarissimo il sistema di autorizzazioni utilizzato.
Essendo di tipo gerarchico pensavo che avendo una struttura del tipo
autore<amministratoreParziale<amministratoreTotale
nel caso non fosse valida la regola relativa ad "autore" sarebbe stata quindi verificata amministratore Parziale.
Invece nel momento in cui la bizRule "autore" fallisce, checkAccess ritorna immediatamente False.
in cosa sbaglio?
sensorario
(Sensorario)
November 17, 2011, 7:33am
2
Stai usando un’estensione in particolare?
markux
(Marco Patania)
November 17, 2011, 8:47am
3
la struttura non è propriamente gerarchicha, ma più simile ad un grafo in cui puoi collegare qualsiasi nodo a qualunque altro.
Poi questa viene utilizzata per creare alberi gerarchici.
Per quanto riguarda il checkAccess dipende autore com’è costruito, cmq se l’utente corrente ha l’operazione/task/ruolo autore ritorna true.
Nel tuo caso parli di bizRule che suppongo sia associata ad autore, che controllo effettua?
micko85
(Mickop)
November 17, 2011, 11:57am
4
markux:
Per quanto riguarda il checkAccess dipende autore com’è costruito, cmq se l’utente corrente ha l’operazione/task/ruolo autore ritorna true.
Nel tuo caso parli di bizRule che suppongo sia associata ad autore, che controllo effettua?
la bizRule associata ad autore è la "solita":
return $params["id_item"] == Yii::app()->user->getId();
Naturalmente quando invoco checkAccess gli passo il parametro "id_item".
L’utente collegato non è l’autore dell’item. Indi presumevo che essendo “author” figlio di “admin”, dopo aver verificato che effettivamente non era l’autore del post (ritorna giustamente false), proseguisse cercando tutti i padri di author (in questo caso admin) e verificasse la bizRule. Ma si interrompe prima.
lo snippet per la creazione delle autorizzazioni se puo essere utile è:
$auth=Yii::app()->authManager;
$task=$auth->createTask('author','','return $params["id_item"] == Yii::app()->user->getId();');
$admin=$auth->createRole('admin','','Yii::app()->user->isAdmin();');
$admin->addChild('author');
Dovrebbe essere cosi, non ce l’ho sotto mano
micko85
(Mickop)
November 17, 2011, 11:58am
5
Nessuna estensione, regole scritte da me (vedi sopra).
Sarà sicuramente quello il problema
sensorario
(Sensorario)
November 17, 2011, 12:00pm
6
Io ho installato RIGHTS. Non c’è più nulla da programmare grazie a questa estensione. Rimangono le tabelle e tutta la loro logica. Io ti consiglio di provare questa o altre estensioni più leggere. Considera che utilizzano delle tabelle in formato standard. Più estensioni utilizzano la stessa struttura. E’ facile che tu ora stia utilizzando la stessa struttura.
micko85
(Mickop)
November 17, 2011, 7:37pm
7
Si, il discorso è lo stesso.
Io pensavo che nel caso NON venisse verificata una condizione, allora si sarebbe verificato il "parent" fino a quando uno ritornava TRUE.
Ma spulciando un attimino la funzione checkAccess, sembra proprio che non abbia capito assolutamente come funziona la logica di rbac.
if($this->executeBizRule($item->getBizRule(),$params,$item->getData()))
{
if(in_array($itemName,$this->defaultRoles))
return true;
if(isset($assignments[$itemName]))
{
$assignment=$assignments[$itemName];
if($this->executeBizRule($assignment->getBizRule(),$params,$assignment->getData()))
return true;
}
$parents=$this->db->createCommand()
->select('parent')
->from($this->itemChildTable)
->where('child=:name', array(':name'=>$itemName))
->queryColumn();
foreach($parents as $parent)
{
if($this->checkAccessRecursive($parent,$userId,$params,$assignments))
return true;
}
}
return false;
Sembra quindi che perchè l’accesso sia garantito è necessario che il tipo di controllo effettuato (ad esempio author) ritorni TRUE e, a meno che non sia gia’ esso dichiarato come ROLE, che ricorsivamente almeno un padre faccia altrettanto.
Ma un questo caso non capisco come utilizzare la struttura “padre/figlio” visto che non ne comprendo l’utilizzo.
Qualcuno sarebbe così gentile da chiarirmi il discorso?
Grazie mille!
markux
(Marco Patania)
November 19, 2011, 9:06pm
8
micko85
(Mickop)
November 22, 2011, 1:07am
9
Questo l’ho letto almeno un centinaio di volte.
Ma nonostante cio’ non ho ancora capito il punto…
Non è che qualche anima pia che ha capito meglio di me il funzionamento potrebbe darmi anche solo un indizio?
markux
(Marco Patania)
November 23, 2011, 8:47am
10
secondo me ti sei incartato con la bizRule e quello che ti sfugge è questo passaggio:
Yii first checks the readPost’s business rule (recall that an empty business rule is equivalent to a business rule always returning true). Then it searches for all readPost’s parents - these are author and editor - and checks their business rules as well. The process doesn’t stop when a business rule has been evaluated to true; it only stops when some rule returned false or we have reached the top of the hierarchy and there are no more parents to check.
So what are ways for the checkAccess method to return true? They are two. First, the iteration can stop with a positive result when Yii encounters in the hierarchy a so-called default role - a role that is assigned by default to all authenticated users.
altrimenti se proprio non ne vieni a capo chiamami pure su skype (nick: marilpata) e cerco di aiutarti (consulenza aggratis ovviamente )