[Solved] Utilisateurs toujours guest

Bonjour,

J’aimerais tout d’abord préciser que c’est un plaisir de pouvoir écrire en français ^^

Parce que ce n’est pas évident pour moi, de me faire comprendre en anglais.

Parenthèse fermée :)

Je précise avant toute chose, que j’utilise le module SRBAC.

Via l’interface graphique proposée par SRBAC, j’ai créé 3 rôles “Admin”, “UserPrivilegie” et “User”.

A l’aide de mes controllers, SRBAC me permet de créer automatiquement des Tasks et des Operations, et fait le lien entre les tasks et les opérations qui ont le même nom de controller.

J’ai ensuite assigné toutes les tâches à l’utilisateur “Admin” (toujours via l’interface SRBAC).

Dans mon bandeau de menu, définie dans /views/layout/main.php, j’ai restreint la visibilité de certaines “rubriques” à l’administrateur via :


$this->widget('application.extensions.menu.SMenu',

array("menu"=>array(

   array("url"=>array(), "label"=>"Administration", "visible"=>Yii::app()->user->isAdmin(),

      array("url"=>array("route"=>"/user/index"), "label"=>"Gérer les utilisateurs"),

      array("url"=>array("route"=>"/projet/index"), "label"=>"Gérer les projets"),

),

Mon problème [size=“1”](enfin ^^)[/size] c’est que lorsque je me logge en tant qu’Administrateur, je suis toujours un Guest “aux yeux de l’application”.

Je ne sais pas comment je peux préciser le rôle de l’utilisateur qui tente de se logger.

Et surtout où je dois le faire :

  • dans la méthode actionLogin() de SiteController.php ?

  • dans la méthode authenticate de UserIdentity.php ?

  • dans le fichier WebUser.php ?

  • ailleurs ?

En vous remerciant.

PS : voici ma méthode actionLogin


public function actionLogin(){

    $model=new LoginForm();

	$authitem = new SDbAuthManager();        		

    // collect user input data

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

    {

        $model->attributes=$_POST['LoginForm'];

        // validate user input and redirect to the previous page if valid

        if($model->validate())

        {

            // Mise à jour de la date de connexion de l'utilisateur

            Yii::app()->db->createCommand()->update('user',

            array('dateConnexion'=>date("Y-m-d"),) , 'rpi=:rpi', array(':rpi'=>$model->username));

            $userid = Yii::app()->db->createCommand()->select('id')->from('user')

                ->where('rpi=:rpi', array(':rpi'=>$model->username))->queryScalar();

            if ($authitem->checkAccess('RM', $userid))

            {

                Yii::app()->user->setState('RM', 1);

                Yii::app()->user->setReturnUrl(#Adresse#);

                $this->redirect(Yii::app()->user->returnUrl);

            }

            $this->redirect(Yii::app()->user->returnUrl);

        }

    }

    // display the login form

    $this->render('login',array('model'=>$model));

}

PS2 : Je voulais préciser également, que je ne comprend pas trop comment utiliser l’Access Control Filter et RBAC, malgré ce tuto :(

La classe PostController est elle obligatoire pour tout projet ou est elle juste un exemple d’utilisation des filtres dans un controller ?

Bonjour,

Je ne suis pas le mieux placé pour t’aider mais je vais tenter de le faire quand même.

Tout d’abord, j’ai déjà tenter d’utilisé SBRAC mais je ne suis pas parvenu à l’utilisé, j’ai alors opté pour une autre méthode : acessControl (pas aussi performante que SBRAC mais elle se défend plutôt bien).

Dans ton controller colle ça, tu reconnaitras surement le code (c’est le système de contrôle d’accès de yii par défaut) :


public function filters()

	{

		return CMap::mergeArray(parent::filters(),array(

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

		));

	}

	/**

	 * Specifies the access control rules.

	 * This method is used by the 'accessControl' filter.

	 * @return array access control rules

	 */

	 public function accessRules()

        {

                return array(

                        array('allow',  // allow all users to perform 'index' and 'view' actions

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

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

                        ),

                        array('allow', // allow authenticated user to perform 'create' and 'update' actions

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

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

                        ),

                        array('allow', // allow admin user to perform 'admin' and 'delete' actions

                                'actions'=>array('admin','delete'),

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

                        ),

                        array('deny',  // deny all users

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

                        ),

                );

        } 

Examinons ceci :


 array('allow', // allow admin user to perform 'admin' and 'delete' actions

                                'actions'=>array('admin','delete'),

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

                        ),

Première array : (allow, action, users)

donc 1 entrée, allow ou deny,

2 entrée : action, on choisit le nom de l’action de ton controller (par exemple actionIndex, actionView)

3 entrée : users, la on entre tout les users concerné.

Si on remarque quand on entre “array(’?’)” sa doit être une façon de dire au controller : “liste de tout les admins”.

Seulement tu peux aussi entrée :


 array('allow', // allow admin user to perform 'admin' and 'delete' actions

                                'actions'=>array('admin','delete'),

                                'users'=>Yii::app()->getModule('user')->getAdmins(),

                        ),

ou GetAdmins() est une fonction permettant de lister tout les admin.

De la même façon on pourrais créer une function par "rang" (par exemple GetModo, GetNewser, etc …) afin de créer un système un peut plus poussé.

Je profite de ce post pour poser ma question vis à vis de la gestion de rôles utilisateurs…

Lequel de SRBAC et de RIGHTS (voir un autre, qui sait) serait plus apte à gérer un peu plus de 400 utilisateurs ???

Dans l’attente d’une réponse, mes salutations ^^

Bonjour,

Le nombre d’utilisateur n’a rien à voir, ce qui compte c’est la façon dont tu veux gérer les droits qui compte.

Si tu veux simplement un panneau de modération/V.I.P./administration valable pour TOUT le site alors AcessControl convient parfaitement.

Par contre si tu veux une gestion plus poussé (en fonction du controller du site) la il te faudra utilisé SBRAC

Bonjour,

Merci pour ta réponse Co-k-ine, mais comme tu viens de le dire dans ton dernier post la puissance de l’Access Control s’arrete lorsque l’on veut donner des droits différents aux utilisateurs, en fonction de leur rôle et ce sur plusieurs controllers. (enfin c ce que j’ai compris, mais bon …)

Par contre, depuis ma question je me suis un peu dépatouillé avec SRBAC et je suis arrivé à une gestion des rôles qui me convient. Mais cela nécessite encore certain tests pour éprouver mes dires, c’est pour ça que je ne présenterais pas dans ce post ce que j’ai fait, pas encore :)

Seulement j’ai un soucis, et pas des moindres. Après quelques tentatives pour intégrer et utiliser SRBAC, j’ai perdu (sans là retrouver) l’authentification. Je précise, pour être plus clair.

Après identification, je suis toujours considéré comme visiteur (utilisation de la méthode isGuest). Ce qui est plutôt contraignant. Et ce qui me dérange le plus, c’est que je n’arrive pas à corriger ce problème.

J’ai pourtant fait le comparatif avec un backup, antérieur à l’utilisation de SRBAC, mais rien n’y fait. Je ne trouve pas l’erreur.

Je mets la méthode authenticate de UserIdentity, en espèrant que ce sera un bon point de départ.


public function authenticate()

	{

		$ldap = new Ldap();

		

		//if ($_SERVER['PHP_AUTH_USER'] == ""  || $_SERVER['PHP_AUTH_PW']=='' ) {

			$_SERVER['PHP_AUTH_USER'] = $this->username;

			$_SERVER['PHP_AUTH_PW'] = $this->password;

		//}

		

		// authentification

		$rep = $ldap->ldap_authenticate();

		//echo $rep;

		//if (is_array($rep) || is_object($rep)) {

		if ($rep[0]=='uid')  {

			//$this->username = $_SERVER['PHP_AUTH_USER'];

			//$this->password = $_SERVER['PHP_AUTH_PW'];

			// charge les infos utilisateur depuis la base LDAP

			$this->_attributes = $ldap->getallAttribute($this->username);

			//Yii::trace(print_r($this->_attributes,true));

			$this->errorCode = ERROR_NONE;

			

		} else $this->errorCode = ERROR_PASSWORD_INVALID;

		$ldap->ldap_disconnect();

		unset($ldap);

		return $this->errorCode;

	}

Bon, je vais vous dire mon erreur mais à demi mot seulement parce que c’est totalement idiot.

Pour arriver à utiliser SRBAC j’ai fait plusieurs tests et j’ai également commenté certaines lignes, parfois partiellement. En l’occurence c’est ce qui est arrivé pour une utilisation de la méthode setState (celle là même où je spécifiais que l’utilisateur avait un “id” et n’était donc plus un guest)

Cette épine étant retirée de mon pied, je vais pouvoir m’atteler au joie de la gestion des rôles (avec SRBAC) et utiliser des checkAccess à tout va :)

Mais ne vous inquietez pas :rolleyes: , j’ai encore plein de questions qui me conduiront inévitablement à la création d’autres topics.