Ho provato a scrivere questa regola. Mi trovo nella pagina di aggiornamento di un utente, e voglio che ad aggiornare sia solamente l’utente proprietario dell’account. Ho provato con questo codice. Ma devo aver frainteso l’uso di expression perché non funziona =(.
Ho anche provato a fare un var_dump($record); Mi restituisce un array corretto se mi trovo o meno nella pagina dell’utente. Però ricevo sempre lo stesso messaggio 403: non ho il permesso di accedere.
Nella view? Non era più semplice fare checkAccess(‘role’, $param) direttamente nel controller e passargli i parametri? Temo che $_GET non venga visto dall’expression…
ho avuto i tuoi stessi dubbi/problemi, mi ci è voluto qualche giorno per documentarmi su tutto ghgh
In ogni caso la soluzione che utilizzo sono i filtri (seppur con Rights questa volta).
public function filters()
{
return array(
'updateOwn + test', // applica il filtro updateOwn all'action test
'rights',
);
}
public function filterUpdateOwn($filterChain)
{
// Controllo il permesso passando il parametro
if(Yii::app()->user->checkAccess('UpdateOwn', array('userid'=>$_GET['id'])))
// rimuovo il filtro "rights" da filters(). 1 è il suo indice, 0 è quello di questo filtro!
$filterChain->removeAt(1);
$filterChain->run();
}
public function actionTest()
{
$this->render('test');
}
Non bisogna dimenticarsi di assegnare la rules "UpdateOwn" a una che viene assegnata a tutti gli utenti, ad esempio authenticated.
public function actionUpdate($id)
{
$model=$this->loadModel($id);
// Uncomment the following line if AJAX validation is needed
// $this->performAjaxValidation($model);
if(isset($_POST['User']))
{
$model->attributes=$_POST['User'];
if($model->save())
$this->redirect(array('view','id'=>$model->id));
}
if (($model->id)==(Yii::app()->user->id)) {
$this->render('update',array('model'=>$model,));
}else{
$this->render('nonseiautorizzato');
}
}
con accessrule :
array('allow', // allow authenticated user to perform 'create' and 'update' actions
'actions'=>array('update','index'),
'roles'=>array('modificaPropriDati'),
),