Programación

Autenticación de usuarios utilizando una base de datos en Yii

Primero crear la tabla usuarios en su DB  [Para usar una determinada DB para su aplicación web deben de vincularla primero (El script es para MySql, pero lo pueden adaptar para su gestor de base de datos), ver este tema]:

— —————————-
— Table structure for `usuarios`
— —————————-
DROP TABLE IF EXISTS `usuarios`;
CREATE TABLE `usuarios` (
`id_usuario` int(11) NOT NULL AUTO_INCREMENT,
`nick_usuario` varchar(128) NOT NULL,
`pass_usuario` varchar(128) NOT NULL,
PRIMARY KEY (`id_usuario`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Luego crear el modelo y el CRUD de esta tabla con el Gii

En protected/components/UserIdentity.php sustituimos la clase UserIdentity por:


<?php
class UserIdentity extends CUserIdentity
 {
 private $_id;

 public function authenticate()
 {
 $username=strtolower($this->username);
 $user=Usuarios::model()->find('LOWER(nick_usuario)=?',array($username));
 if($user===null)
 $this->errorCode=self::ERROR_USERNAME_INVALID;
 else if(!$user->validatePassword($this->password))
 $this->errorCode=self::ERROR_PASSWORD_INVALID;
 else
 {
 $this->_id=$user->id_usuario;
 $this->username=$user->nick_usuario;
 $this->errorCode=self::ERROR_NONE;
 }
 return $this->errorCode==self::ERROR_NONE;
 }

 public function getId()
 {
 return $this->_id;
 }
 }

En protected/models/Usuarios.php agregar las siguientes funciones:


public function validatePassword($pass_usuario)
 {
 return $this->hashPassword($pass_usuario)===$this->pass_usuario;
 }

 public function hashPassword($pass_usuario)
 {
 return md5($pass_usuario);
 }

Para que la clave se guarde en MD5 al crear los usuarios agregar reemplazar la función actionCreate del controlador protected/controllers/UsuariosController.php, hacer lo mismo con la función actionUpdate:


public function actionCreate()
 {
 $model=new Usuarios;

// Uncomment the following line if AJAX validation is needed
 // $this->performAjaxValidation($model);

if(isset($_POST['Usuarios']))
 {
 $model->attributes=$_POST['Usuarios'];
 $model->pass_usuario=md5($model->pass_usuario); //Esta es la linea que se debe agregar
 if($model->save())
 $this->redirect(array('view','id'=>$model->id_usuario));
 }

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

 public function actionUpdate($id)
 {
 $model=$this->loadModel($id);

if(isset($_POST['Usuarios']))
 {
 $model->attributes=$_POST['Usuarios'];

 $model->pass_usuario=md5($model->pass_usuario); //Esta es la linea que se debe agregar
 if($model->save())
 $this->redirect(array('view','id'=>$model->id_usuario));
 }

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

Si se quiere cambiar los permisos a usuarios se debe de modificar el controlador (función accessRules), en este caso protected/controllers/UsuariosController.php:


public function accessRules()
 {
 return array(
 array('allow', // allow all users to perform 'index' and 'view' actions
 'actions'=>array('index','view'),
 'users'=>array('*'),
 ),
 array('allow', // allow authenticated user to perform 'create' and 'update' actions
 'actions'=>array('create','update'),
 'users'=>array('@'),
 ),
 array('allow', // allow admin user to perform 'admin' and 'delete' actions
 'actions'=>array('admin','delete'),
 'users'=>array('admin'),
 ),
 array('deny', // deny all users
 'users'=>array('*'),
 ),
 );
 }

En el arreglo actions ponemos las acciones que tiene el controlador y en users los usuarios, si queremos que solo accedan los que están autenticados ponemos una ‘@’ y si queremos que acceda cualquier personas usamos ‘*’.

En el ejemplo se nota también que las acciones admin y delete solo tiene permiso el usuario admin, eso por ejemplo es una utilidad muy válida para proteger la aplicación.

Agregado: Recomiendo la extensión CRUGE (Cruge es un API para Yii Framework que extiende del api oficial de YII Auth, que unifica varias cosas de YII Auth) , también les dejo el link del wiki de la extensión.

Salir de la versión móvil