RBAC qualcuno che mi aiutare (nuovo utente)

Ciao a tutti

sto provando a capire come funzione le rule base access control ho creato il file controller in questo modo


<?php


/**

 * Controller

 */


class SiteController extends CController

{

	/**

	 * Index action is the default action in a controller.

	 */

	 

	public function filters()

	{

		return array(

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

		);

	}

	

	public function accessRules()

	{

		return array(

			array('allow', 

				'actions'=>array('index','view'),

				'users'=>array('*'),

			),

			array('allow',

				'actions'=>array('create'),

				'users'=>array('admin'),

			),

			

			array('deny', 

				'users'=>array('*'),

			),

		);

		

		$d=new Dati();

	}

	

  

    

    

	public function actionCreate()

	{	.......

    	

	}

	

	public function actionIndex()

	{	

		static $scelta=array(

			'show data user',

			'create data utente',

		);

			

		if(isset($_POST['scelta']))

		{

			$s=$_POST['scelta'];

			if($s==0)

			{	

				header("location: index.php?r=contact/View");

			}

			else 

			{	

				

				header("location: index.php?r=contact/create");

							

			}

		}

		else

		{	$params=array(

					'scelta'=>$scelta,

					'error'=>Yii::app()->request->isPostRequest,

				);

				$this->render('index', $params);

			

		}

		

	}

	


	

	function actionView()

	{

             .....

             ...

	}

}



ed poi ho creato un nuovo file con dentro tutte le rules operation e task ma adesso non so come usare queste regole.

devo importare questo file dentro il control oppure richiamare la funzione rules in controller, altrimenti mi potete spiegare dove posizionare queste regole.

Ho già fatto la parte di login con utente ha id username e password "Yii::app()->user->login($this->_identity,$duration);"


<?php 

class Rules

{   

	function rules()

	{

				

		$auth=Yii::app()->authManager;

		

		$auth->createOperation('View','show data user');

		$auth->createOperation('create','create data user');

		

		$role=$auth->createRole('Admin');

		$role->addChild('View');

		$role->addChild('create');

		 

		$role=$auth->createRole('User');

		$role->addChild('View');

		

		

		$auth->assign('Admin','adminA');

		$auth->assign('User','UserB');

	}

}

?>



quando cerco di creare l’utente mi dice “You are not authorized to perform this action” (il file rules.php non l’ho usato da nessuna parte).

Come posso procedere?

Io apprezzo la tua voglia di complicarti la vita =). Ma ci sono decine di estensioni che ti permettono di gestire questa cosa in automatico senza scrivere codice. Sicuro di voler procedere con questa strada? Se ne vale la pena, auguri =).

hhahahhaaa nn sapevo k mi stavo complicando la vita.

siii voglio imparare scrivendo un pò di codice, magari dopo ci provo anche con le estensioni…

ho seguito un pò questo link http://www.yiiframework.com/wiki/136/getting-to-understand-hierarchical-rbac-scheme/ ma non ho idea di dove mettere il codice di rules task and operation.

Grazie x l’aiuto

Scherzi a parte … anche io ho inziato come te … quando ho scoperto quel link ho iniziato a ragionare in questo modo:

Ogni volta che ce n’è bisogno, creo una operazione e poi la associo all’utente. In questo modo nel codice non devo fare altro che Yii::app()->checkAccess(‘NomePermesso’);

Solo una cosa: occhi ai permessi dentro ai controllers. Dovrai cambiare users in roles




array('allow',

    'actions'=>array('create'),

    'users'=>array('admin'),

),



in




array('allow',

    'actions'=>array('create', 'someAction', 'blaBla'),

    'roles'=>array('Admin'),

),



In questo modo ti basterà assegnare un ruolo agli utenti per abilitarli a fare qualche cosa. con yii standard dovresti, ogni volta, aggiungere un elemento ad users. Capisci anche tu che non è molto produttivo.

Se vuoi, puoi provare RIGHTS. RIGHTS ti permette, in pochi passi, di capire come funziona la faccenda dei permessi. In oltre ti "protegge" dal dover riscrivere il codice. Ma prima di arrivare a RIGHTS fai bene a sporcarti le mani. A me è servito. Se serve aiuto fammi sapere. E scusami se non ho risposto in modo gentile la prima volta. =(

Il punto è che voglio imparare yiii e per fare questo devo capire quello che faccio, invece se vado a usare subito le estensioni dopo nn ci capisco niente di quello che faccio.

ci sono su quello che hai detto, ma questo codice dove lo metto?


$auth=Yii::app()->authManager;


$auth->createOperation('View','show data user');

$auth->createOperation('create','create data user');


$role=$auth->createRole('Admin');

$role->addChild('View');

$role->addChild('create');


$role=$auth->createRole('User');

$role->addChild('View');




$auth->assign('Admin','1');

$auth->assign('User','2');



in controller ho fatto così


return array(

array('allow', 

'actions'=>array('index','view'),

'users'=>array('*'),

),

array('allow',

'actions'=>array('create'),

'roles'=>array('admin'),

),


array('deny', 

'users'=>array('*'),

),

);

Ho risolto il problema grazie a sensorario…

c’era alcune cose che non mi erano chiare.

Tipo che il codice di rules operation and task una volta eseguite si memorizzano nel database.

le tabelle in cui vengono memorizzate sono:




CREATE TABLE `AuthAssignment` (

  `itemname` varchar(64) COLLATE utf8_bin NOT NULL,

  `userid` varchar(64) COLLATE utf8_bin NOT NULL,

  `bizrule` text COLLATE utf8_bin,

  `data` text COLLATE utf8_bin,

  PRIMARY KEY (`itemname`,`userid`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;


CREATE TABLE `AuthItem` (

  `name` varchar(64) COLLATE utf8_bin NOT NULL,

  `type` int(11) NOT NULL,

  `description` text COLLATE utf8_bin,

  `bizrule` text COLLATE utf8_bin,

  `data` text COLLATE utf8_bin,

  PRIMARY KEY (`name`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;


CREATE TABLE `AuthItemChild` (

  `parent` varchar(64) COLLATE utf8_bin NOT NULL,

  `child` varchar(64) COLLATE utf8_bin NOT NULL,

  PRIMARY KEY (`parent`,`child`),

  KEY `child` (`child`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;



Il codice di rules task and operation l’ho messo nel action di un controller

ho eseguito questo codice una volta solo inserendo il link in alto tipo:


localhost:8888/index.php?r=controller/action

Il controller alla fine era fatto così




<?php


class SiteController extends Controller

{

	public function filters()

	{

		return array(

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

		);

	}




	public function accessRules()

	{

		return array(

                       array('allow', 

                          'actions'=>array('index','view'),

                          'users'=>array('*'),

                        ),


                       array('allow',

                          'actions'=>array('create'),

                          'roles'=>array('admin'),

                        ),


                      array('deny', 

                         'users'=>array('create'),

                      ),

                );

           

	}


        public function actionRuoli()

	{

		$auth=Yii::app()->authManager;


                $auth->createOperation('View','show data user');

                $auth->createOperation('create','create data user');


                $role=$auth->createRole('Admin');

                $role->addChild('View');

                $role->addChild('create');


                $role=$auth->createRole('User');

                $role->addChild('View');




                $auth->assign('Admin','1');

                $auth->assign('User','2');

	}

}


in questo caso per eseguire le regole per una volta sola ho inserito in alto nella barra di indirizzi:

localhost:8888/index.php?r=site/Ruoli



il codice che si trova nel accessRules() controlla in automatico nel database con questo comando


 'actions'=>array('create'),

'roles'=>array('admin'),

che controlla nel database se utente loggato può accedere al action oppure no.

al utente 1 che si trova nella tabella User ha i permessi di admin invece utente 2 quello di un User (normale)

admin viene assegnato con questo comando


$auth->assign('Admin','1');

$auth->assign('User','2');

le tabella del user è fatta in questo modo


CREATE TABLE `user` (

  `id` int(11) NOT NULL AUTO_INCREMENT,

  `username` varchar(128) COLLATE utf8_bin NOT NULL,

  `password` varchar(128) COLLATE utf8_bin NOT NULL,

  `remember` tinyint(1) DEFAULT NULL,

  `email` varchar(128) COLLATE utf8_bin NOT NULL,

  PRIMARY KEY (`id`)

) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=4 ;


INSERT INTO `user` VALUES(1, 'khurram', 'password', NULL, 'khurram_619@msn.com');

INSERT INTO `user` VALUES(2, 'demo', 'demo', NULL, 'demo@demo.it');

Se utente loggato con khurram che ha id 1 può eseguire action create.

Non è vero che lo ha risolto grazie a me =). Io gli ho solo dato una spintarellina.

Ciao a tutti, sto implementando l’autenticazione utente tramite RBAC. Vi chiedo una delucidazione. Qual’è la differenza tra implementare una regola scrivendola nella funzione accessRules() in un controller e scriverla in database (faccio riferimento alla funzione actionRuoli() di khurram). Ovvero cosa cambia tra:




public function accessRules()

        {

                return array(

                       ...


                       array('allow',

                          'actions'=>array('create'),

                          'roles'=>array('admin'),

                        ),


                     ...

                );

           

        }




e




 public function actionRuoli()

        {

                $auth=Yii::app()->authManager;


                $auth->createOperation('create','create data user');


                $role=$auth->createRole('Admin');

                $role->addChild('create');

              

                $auth->assign('Admin','1');

               

        }




Grazie mille

Nel primo caso gli utenti sono definiti in un array fisso, nel secondo in una tabella del db. In questo topic trovi un esempio pratico che dovrebbe meglio spiegarti come funziona l’autenticazione.