Systemy uprawnień

Witam, w aktualnych projektach używam frameworka kohanaphp lecz od bardzo długiego czasu przyglądam się yii.

Yii bardzo mnie intryguje i w następnych projektach chciałbym właśnie z tego frameworka korzystymać.

Jest tylko pewien problem, nie wiem jak mam korzystać z modułów związanych z uprawnieniami, po instalacji modułu kiedy ustawiam teoretycznie aby zabronić lub zezwolić na dostęp do pewnej akcji to nic się w praktyce nie zmienia.

Domyślam się że może chodzić o filtry.

(Nie pisałem o którym module mowa ponieważ sprawdzałem kilka a rozwiązanie które ewentualnie podacie powinno zadziałać przy każdym)

Prawdopodobnie może się okazać że mój problem jest czymś błahym ale wole się zapytać i się dowiedzieć niż się kryć i niczego nowego się nie nauczyć ^^

Cześć,

Serdecznie polecam Ci Yii. Długo szukałem frameworka odpowiedniego dla mnie i myślę, że już mam. Wcześniej testowałem CodeIgnitera, przyjrzałem się Zend, Cake, Symfony i paru innym.

Co do Twojego pytania to domyślam się, że chcesz skorzystać z modułów RBAC. Niedawno wdrożyłem moduł RBAM (jest do pobrania w rozszerzeniach). Polecam Ci go, u mnie działa wyśmienicie. Musisz zainstalować go zgodnie z instrukcją a w kontrolerach musisz zdefiniować filtr oraz przypisać uprawnienia do akcji. Np:




	/**

	 * @return array action filters

	 */

	public function filters()

	{

		return array(

			'accessControl', // perform access control for CRUD operations

		);

	}


  public function accessRules()

  {

    return array(

      array(

        'allow',

        'roles'=> array('RBAC Manager')

      ),

      array(

        'deny',

        'users'=> array('*')

      ),      

    );

  }



W elementach ‘inline’ gdzie jakiś fragment strony ma się pojawiać bądź też nie w zależności od uprawnienia (najczęściej parametr ‘visible’ lub zwykły if) stosujesz funcję checkAccess:




		<?php $this->widget('zii.widgets.CMenu',array(

			'items'=>array(

				array('label'=>'Home', 'url'=>array('/site/index')),

        array('label'=> Yii::t('app', 'Klient'), 'url'=>array('/client')),

        array('label'=> Yii::t('app', 'Zamówienie'), 'url'=>array('/order'), 'visible'=>Yii::app()->user->checkAccess('Order')),

				array('label'=>'About', 'url'=>array('/site/page', 'view'=>'about')),

				array('label'=>'Contact', 'url'=>array('/site/contact')),

				array('label'=>'HR', 'url'=>array('/recruit'), 'visible'=>Yii::app()->user->checkAccess('Recruit')),

        array('label'=>'Admin', 'url'=>array('/admin'), 'visible'=>Yii::app()->user->checkAccess('RBAC Manager')),

        array('label'=>Yii::t('app', 'Zaloguj'), 'url'=>array('/site/login'), 'visible'=>Yii::app()->user->isGuest),

				array('label'=>Yii::t('app', 'Wyloguj') .' ('.Yii::app()->user->name.')', 'url'=>array('/site/logout'), 'visible'=>!Yii::app()->user->isGuest)

			),

		)); ?>



Chciałbym się dowiedzieć jaka jest techniczna różnica między zadaniami (Tasks) a operacjami (Operations).

Task może grupować operacje. To w zasadzie jedyna różnica.

Czyli operacje można przypisać do task a task i operacje można przypisać do roli, zgadza się ?

Czyli innymi słowy task służy aby uporządkować sobie operacje na grupy?

Dokładnie. 3 poziomy kontroli dostępu: rola/zadanie/operacja plus reguły biznesowe dają ogromne możliwości dopuszczania użytkowników systemu tylko do wybranych zasobów. Oczywiście jest koszt tego rozwiązania - więcej operacji bazodanowych (chyba, że zdefiniujemy uprawnienia w kodzie czego nie widzę ze względu na brak interfejsu zarządzania i trudność połapania się o co chodzi ;).

podczepię się pod wątek.

Czy mógłby wkleić ktoś kompletny albo prawie kompletny kod kontrolera z użyciem RBAC ?

Nie mogę do końca tego załapać a to mi na to pozwoli.

Witam,

Dołączę się do tematu. Ciekawi minie kwestia systemu uprawnień w Yii. Otóż, autorzy frameworku przyjęli koncepcje hierarchii uprawnień (bardzo fajnie). Nie mogę jednak zrozumieć, po co hierarchia budowana jest dla wszystkich użytkowników, skoro interesuje nas jeden (czyli osoba aktualnie korzystająca z aplikacji opartej na Yii)? Sprawdzenie uprawnień wywoływane jest przez metodę:


Yii::app()->user->checkAccess(...)

czyli odwołuje się do aktualnie zalogowanego użytkownika. Skoro tylko do niego, to po co w hierarchii przechowywać uprawnienia innych użytkowników? Cytat z tutoriala:


$auth->assign('reader','readerA');

$auth->assign('author','authorB');

$auth->assign('editor','editorC');

$auth->assign('admin','adminD');

Kolejne moje pytanie to miejsce "cachowania" stworzonej hierarchii. Chyba nie jest ona budowana na nowo przy każdym wywoływaniu strony?

Oczywiście przewiduję, że mogę się mylić. Proszę wiec o poprawienie mojego toku rozumowania.

Pozdrawiam.

Hierarchia jest Ci potrzebna, jeśli masz zależności pomiędzy rolami. Załóżmy, że masz dokładnie te 4 role, które są w przewodniku.

Admin dziedziczy uprawnienia z edytora (i zmienia je), edytor z czytelnika (i zmienia ich część) a autor dziedziczy z edytora (ale tylko dla własnego wątku/wpisów).

Jeśli jesteś edytorem, to system musi zbudować hierarchię zależności uprawnień pomiędzy tymi rolami. Oczywiście przypisanie konkretnej roli, robisz już wtedy tylko dla siebie/danego użytkownika.

Pamiętaj, że tutorial został tak napisany, aby dać przegląd wszystkich możliwości w miarę, krótkiej i spójnej formie.

Jasne. Problemem pozostaje dla mnie jeszcze cachowanie całej hierarchii. Nie widzę większego sensu w ładowaniu ról przy każdym odświeżaniu strony.

Najlepszym rozwiązaniem wg. mnie jest stworzenie takiej hierarchii w statycznej tablicy i dodanie jej do cache. Niektóre rozszerzenia tybu RBAC zapisują w cache zapytania do bazy ale to i tak wolno działa. Ideałem wg mnie był by system ról tworzony w bazie jakimś wygodnym interfejsem a zapisywany i użytkowany ze statycznej tablicy.

Yii podchodzi do tego tematu (jak i do innych) w trochę odmienny sposób niż pozostałe frameworki. Mianowicie, dostajesz do ręki bazowe klasy oraz mechanizmy, pozwalające Ci na zbudowanie dowolnego systemy autoryzacji. Nikt natomiast nie narzuca Ci bezpośrednio w jaki sposób masz sobie tę hierarchię autoryzacji przechowywać. Jedynym wyjątkiem jest tutaj klasa CDbAuthManager, która po prostu przechowuje w bazie informacje o autoryzacji i jest prostym narzędziem pozwalającym zarządzać rolami. Być może w Twoim przypadku wystarczy rozszerzyć tę klasę oraz dodać preferowaną przez Ciebie formę buforowania hierarchii.