RBac

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?

Stai usando un’estensione in particolare?

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?

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 :(

Nessuna estensione, regole scritte da me (vedi sopra).

Sarà sicuramente quello il problema :)

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.

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!

http://www.yiiframework.com/wiki/136/getting-to-understand-hierarchical-rbac-scheme

:) 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?

secondo me ti sei incartato con la bizRule e quello che ti sfugge è questo passaggio:

altrimenti se proprio non ne vieni a capo chiamami pure su skype (nick: marilpata) e cerco di aiutarti (consulenza aggratis ovviamente :) )