Sistema de Login
Por zsamer en Mayo 1, 2008
Mi objetivo en este articulo es simplemente mostrar una forma de implementar un sistema de login de usuarios con Zend Framework.
Antes de empezar a tirar lineas de código necesitamos tener claro que componentes de ZF vamos a utilizar, por supuesto que el más importante es Zend_Auth, el cual provee un API de autenticación que incluye diferentes adaptadores para diferentes escenarios, en nuestro caso vamos a utilizar uno que nos permita chequear contra la base de datos Zend_Auth_Adapter_DbTable, requiere una instancia de nuestro objeto de conexión a la base de datos (Zend_Db_Adapter_Abstract) que es pasado por el constructor.
El adaptador mencionado arriba tiene la habilidad de autenticarse contra las credenciales almacenada en la base de datos, para el ejemplo vamos a trabajar como siempre con nuestro querido motor Mysql. Aquí tenemos tres parámetros muy importantes que necesitamos configurar y estos son:
- tableName el nombre de la tabla que contiene las credenciales.
- identityColumn que corresponde al campo de nuestra tabla que representa la identidad que debe contener valores único como el nombre de usuario o email.
- credentialColumn correspondiente a la credencial del usuario, comúnmente un password, ojalas encriptado.
Para comenzar con nuestro ejemplo ideal sería haber leído algo del set de artículos Comenzando con ZendFramwork, lo que vamos a hacer es retomar lo que ya habíamos hecho y adaptarlo a un sistema de usuarios donde sólo los usuarios logeados/autenticados podrán hacer comentarios, suena interesante ¿no?, bueno si aun están interesados en seguir leyendo esta entrada desde ya les doy la bienvenida.
Nuestra estructura de directorio sería exactamente la misma, ahí no cambia nada, solo necesitaremos agregar el Controlador, Modelo y vista en función del usuario y hacer un par de modificaciones a lo que ya teníamos del sistema de Comentarios.
Lo primero es agregar una sola linea en nuestro archivo index.php o puerta de entrada al sistema aveces llamado bootstrap file.
Aquí sólo vamos a agregar la autocarga de clases que trae Zend Framwork, Zend_Loader::registerAutoload() nos incluye las clases sin tener que cargarlas explicitamente con Zend_Loader::loadClass(), includes o require cuando las necesitemos, ZF lo hace automáticamente por nosotros
.
Entonces nuestro index.php o bootstrap quedaría de la siguiente forma:
quickstart/public/index.php
-
<?php
-
/** Bootstrap */
-
/** Configuración de manejo de error */
-
-
/** Configuración de Directorios */
-
$rootPath . '/application/config' . PATH_SEPARATOR .
-
$rootPath . '/application/models' . PATH_SEPARATOR .
-
$rootPath . '/library' . PATH_SEPARATOR .
-
$rootPath . '/public');
-
-
/** Nuevo Autocarga de clases de Zend FrameWork */
-
require_once 'Zend/Loader.php';
-
Zend_Loader::registerAutoload();
-
-
/** Carga el archivo de configuración ini */
-
require_once 'Zend/Config/Ini.php';
-
$config = new Zend_Config_Ini('quickstart.ini', 'default');
-
-
/** Inicializa y conecta Base de Datos */
-
require_once 'Zend/Db.php';
-
require_once 'Zend/Db/Table/Abstract.php';
-
$db = Zend_Db::factory($config->database);
-
Zend_Db_Table_Abstract::setDefaultAdapter($db);
-
-
/** Inicializa layout */
-
'layout' => 'Main',
-
'layoutPath' => '../application/layouts/scripts/'
-
);
-
-
require_once 'Zend/Layout.php';
-
//Zend_Layout::startMvc($config->appearance);
-
Zend_Layout::startMvc($options);
-
-
require_once 'Zend/Controller/Front.php';
-
$frontController = Zend_Controller_Front::getInstance();
-
-
$frontController->setControllerDirectory($rootPath . '/application/controllers')
-
->throwExceptions(true)
-
->dispatch();
Nuestro layout main.html también necesitará un par de ajustes menores:
quickstart/application/layouts/scripts/main.phtml
-
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-
<html>
-
<head>
-
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
-
<title>Quickstart</title>
-
</head>
-
<body>
-
<h1>Quick start</h1>
-
<p>
-
| <a href="<?php echo $this->baseUrl; ?>">Home</a>
-
| <a href="<?php echo $this->baseUrl; ?>/about">About</a>
-
<?php if($this->loggedIn):?>
-
| <a href="<?php echo $this->baseUrl; ?>/user/">Perfil</a>
-
<?php else:?>
-
| <a href="<?php echo $this->baseUrl; ?>/user/">Login</a>
-
<?php endif;?>
-
-
<?php if($this->loggedIn):?>
-
| <a href="<?php echo $this->baseUrl; ?>/user/logout">Logout (<?php echo $this->user->username;?>)</a>
-
<?php endif;?>
-
-
</p>
-
</body>
-
</html>
Como se habrán dado cuenta nuestro menú del header cambió ahora incorpora algunas secciones de usuarios, si el usuario no ha iniciado sesión entonces me deberá dar un link al login de usuarios, a la inversa, si este ha iniciado sesión entonces me debería de dar la opción de perfil y logout, si estamos de acuerdos entonces sigamos viendo que sucede.
Sin duda alguna nuestro controlador y vista de los comentarios también han tenido cambios, ya que el requerimiento actual es que sólo los usuarios con sesión/logeado podrán hacer comentarios, entonces nuestro IndexController (controlador de los comentarios) quedará de la siguiente forma:
quickstart/application/controllers/IndexController.php
-
<?php
-
require_once 'Zend/Controller/Action.php';
-
class IndexController extends Zend_Controller_Action
-
{
-
public function init()
-
{
-
$this->view->baseUrl = $this->_request->getBaseUrl();
-
}
-
-
public function preDispatch()
-
{
-
require_once 'UserModel.php';
-
-
if (UserModel::isLoggedIn()) {
-
$this->view->loggedIn = true;
-
$this->view->user = UserModel::getIdentity();
-
}
-
}
-
-
public function indexAction()
-
{
-
require_once 'CommentsTable.php';
-
$form = CommentsTable::getAddCommentForm();
-
-
if ($this->getRequest()->isPost()) {
-
if ($form->isValid($_POST)) {
-
$values = $form->getValues();
-
}
-
}
-
-
$this->view->form = $form;
-
$this->view->title = 'Comentarios';
-
$this->view->comments = CommentsTable::getComments();
-
}
-
}
Se hace uso del método preDispatch() el cual se ejecuta siempre automáticamente antes de ejecutar la acción en cuestión, en nuestro caso, tiene la función de verificar si el usuario ha iniciado sesión, si es así entonces creará una variable de la vista que almacenará el valor boleano verdadero como logeado.
También se incorpora el método init(), permite hacer todas las inicializaciones de manera muy simple sin la necesidad de sobrescribir el constructor de la clase __construct(), en nuestro caso creamos otra variable de la vista para almacenar la base Url.
Hasta ahora todo marcha como corresponde, pero aun faltan cosas, como los cambios en la vista de los comentarios, nuestro index.phtml.
quickstart\application\views\scripts\index\index.phtml
-
<?php if($this->loggedIn):?>
-
<ul>
-
<?php foreach ($this->comments as $comment) :?>
-
<?php endforeach; ?>
-
</ul>
-
<?php else:?>
-
<p>Para comentar necesita estar logeado, <a href="<?php echo $this->baseUrl;?>/user/login" title="Login">Login</a></p>
-
<?php endif;?>
Felizmente el modelo de los comentarios (CommentsTable) no sufrió cambió alguno asique lo pueden obtener del artículo anterior Comenzando con Zend Framework: IV Parte.
Bueno hasta el momento sólo hemos expuesto los cambios sufrido a nuestro sistema de comentarios, ahora nos queda exponer lo nuevo y esto es en función del Modelo, Vista y Controlador del Usuario, aquí vamos.
Como dijimos antes nuestro ejemplo vamos a utilizar a Mysql como nuestro motor de base de datos para guardar los comentarios y usuarios.
La definición o estructura de la tabla de usuarios sería:
-
DROP TABLE IF EXISTS `users`;
-
CREATE TABLE IF NOT EXISTS `users` (
-
`user_id` INT(11) NOT NULL AUTO_INCREMENT,
-
`username` VARCHAR(40) collate latin1_general_ci NOT NULL DEFAULT '',
-
`user_password` VARCHAR(50) collate latin1_general_ci NOT NULL DEFAULT '',
-
`user_email` VARCHAR(50) collate latin1_general_ci DEFAULT NULL,
-
PRIMARY KEY (`user_id`)
-
) ENGINE=MyISAM;
-
-
--
-
-- Volcar la base de datos para la tabla `posters`
-
--
-
-
INSERT INTO `users` (`user_id`, `username`, `user_password`, `user_email`) VALUES
-
(1, 'admin', '21232f297a57a5a743894a0e4a801fc3', 'test@test.cl');
Como ven tenemos un usuario inserto, username "admin" y password "admin", esta viene encriptada con md5.
Respecto a la definición de la tabla de comentario la podrán encontrar en artículos anteriores.
Teniendo la definición de nuestra tabla de usuarios Mysql seguiremos con el controlador de usuario, nuestro UserController.
Nuestro Controlador UserController quedaría de la siguiente forma:
quickstart/application/controllers/UserController.php
-
<?php
-
require_once 'Zend/Controller/Action.php';
-
-
require_once 'UserModel.php';
-
-
class UserController extends Zend_Controller_Action
-
{
-
public function init()
-
{
-
$this->view->baseUrl = $this->_request->getBaseUrl();
-
}
-
-
public function preDispatch()
-
{
-
require_once 'UserModel.php';
-
-
if (UserModel::isLoggedIn()) {
-
$this->view->loggedIn = true;
-
$this->view->user = UserModel::getIdentity();
-
}
-
}
-
-
public function indexAction()
-
{
-
$this->_forward('login');
-
}
-
-
/* ...más métodos Action... */
-
public function loginAction()
-
{
-
require_once 'Zend/Form.php';
-
-
'method' => 'post',
-
'action' => $this->view->baseUrl . '/user/login',
-
'required' => true,
-
'label' => 'Usuario'
-
)),
-
'required' => true,
-
'label' => 'Password'
-
)),
-
'label' => 'Send'
-
))
-
),
-
));
-
-
if ($this->getRequest()->isPost()) {
-
if ($form->isValid($_POST)) {
-
$values = $form->getValues();
-
-
Zend_Loader::loadClass('Zend_Filter_StripTags');
-
$filter = new Zend_Filter_StripTags();
-
-
try{
-
$user = new UserModel();
-
$user->setMessage('El nombre de Usuario y Password no coinciden.', UserModel::NOT_IDENTITY);
-
$user->setMessage('La contraseña ingresada es incorrecta. Inténtelo de nuevo.', UserModel::INVALID_CREDENTIAL);
-
$user->setMessage('Los campos de Usuario y Password no pueden dejarse en blanco.', UserModel::INVALID_LOGIN);
-
$user->login($nick, $password);
-
$this->_redirect();
-
} catch(Exception $e){
-
$responseLogin = $e->getMessage();
-
}
-
-
$this->view->responseLogin = $responseLogin;
-
-
}
-
}
-
-
$this->view->form = $form;
-
$this->view->title = 'Login';
-
-
}
-
-
public function logoutAction()
-
{
-
$user = new UserModel();
-
$user->logout();
-
$this->_redirect();
-
}
-
/* ...más métodos Action... */
-
}
Aquí tenemos varias cositas que comentar, pero devido al tiempo y longitud del articulo les dejo de tarea investigar.
Definamos nuestra clase Modelo para el usuario UserModel, ubicada dentro de la carpeta application/models/ de nuestra aplicación:
quickstart/application/models/UserModel.php
-
<?php
-
require_once 'Zend/Db/Table/Abstract.php';
-
-
class UserModel extends Zend_Db_Table_Abstract
-
{
-
protected $_name = 'users';
-
-
protected $_primary = 'user_id';
-
-
const NOT_IDENTITY = 'notIdentity';
-
-
const INVALID_CREDENTIAL = 'invalidCredential';
-
-
const INVALID_USER = 'invalidUser';
-
-
const INVALID_LOGIN = 'invalidLogin';
-
-
/**
-
* Mensaje de validaciones por defecto
-
*
-
* @var array
-
*/
-
self::NOT_IDENTITY => "Not existent identity. A record with the supplied identity could not be found.",
-
self::INVALID_CREDENTIAL => "Invalid credential. Supplied credential is invalid.",
-
self::INVALID_USER => "Invalid User. Supplied credential is invalid",
-
self::INVALID_LOGIN => "Invalid Login. Fields are empty"
-
);
-
-
/**
-
* @param string $messageString
-
* @param string $messageKey OPTIONAL
-
* @return UserModel
-
* @throws Exception
-
*/
-
public function setMessage($messageString, $messageKey = null)
-
{
-
if ($messageKey === null) {
-
}
-
throw new Exception("No message exists for key '$messageKey'");
-
}
-
$this->_messages[$messageKey] = $messageString;
-
return $this;
-
}
-
-
/**
-
* @param array $messages
-
* @return UserModel
-
*/
-
{
-
foreach ($messages as $key => $message) {
-
$this->setMessage($message, $key);
-
}
-
return $this;
-
}
-
-
public function login($nick, $password)
-
{
-
{
-
Zend_Loader::loadClass('Zend_Auth_Adapter_DbTable');
-
$autAdapter = new Zend_Auth_Adapter_DbTable(self::getDefaultAdapter());
-
$autAdapter->setTableName('users');
-
$autAdapter->setIdentityColumn('username');
-
$autAdapter->setCredentialColumn('user_password');
-
$autAdapter->setIdentity($nick);
-
-
$aut = Zend_Auth::getInstance();
-
-
$result = $aut->authenticate($autAdapter);
-
-
switch ($result->getCode())
-
{
-
case Zend_Auth_Result::FAILURE_IDENTITY_NOT_FOUND:
-
throw new Exception($this->_messages[self::NOT_IDENTITY]);
-
break;
-
-
case Zend_Auth_Result::FAILURE_CREDENTIAL_INVALID:
-
throw new Exception($this->_messages[self::INVALID_CREDENTIAL]);
-
break;
-
-
case Zend_Auth_Result::SUCCESS:
-
if ($result->isValid()) {
-
$data = $autAdapter->getResultRowObject();
-
$aut->getStorage()->write($data);
-
} else {
-
throw new Exception($this->_messages[self::INVALID_USER]);
-
}
-
break;
-
-
default:
-
throw new Exception($this->_messages[self::INVALID_LOGIN]);
-
break;
-
}
-
-
} else {
-
throw new Exception($this->_messages[self::INVALID_LOGIN]);
-
}
-
return $this;
-
}
-
-
public function logout()
-
{
-
Zend_Auth::getInstance()->clearIdentity();
-
return $this;
-
}
-
-
{
-
$auth = Zend_Auth::getInstance();
-
-
if ($auth->hasIdentity()) {
-
return $auth->getIdentity();
-
}
-
return null;
-
}
-
-
{
-
-
return Zend_Auth::getInstance()->hasIdentity();
-
}
-
/* ...más métodos del Modelo Usuario... */
-
}
Finalmente la definición de nuestra vista del usuario sería:
quickstart\application\views\scripts\user\login.phtml
-
<?php if(!$this->loggedIn):?>
-
<?php endif;?>
-
<?php else:?>
-
<h3>Perfil</h3>
-
<?php endif;?>
Tristemente hemos terminado con nuestro tutorial, espero que haya sido de utilidad para muchos y como tarea les dejo la inquietud de hacer el registro de los usuarios.
En nuestro próximo artículo vamos a hacer un Refactoring a nuestro sistema para dejarlo modular, lo que quiero decir es que vamos a tener distintos módulos y cada uno con sus respectivos Modelos, Vistas y Controladores, para que se vallan interiorizando les dejo el siguiente link.
Hasta la próxima
.
Comentarios
36 Responses to “Sistema de Login”
Deja tu comentario

Fiel a la cita de lectura
Un par de preguntas/comentarios…
1) Al utilizar Zend_Loader::registerAutoload() y cargar todas las clases no sería mejor para temas de rendimiento solo cargar las clases que vamos a utilizar, aunque tengamos que ir cargandolas una a una…
2) En el layout main.phtml en Home habría que añadir un “/” ya que a mi me toma el $this->baseUrl “mal” y me pone como acción donde este en lugar del home
La serie continua muy interesante, siguientes pasos… formularios, más módulos, gestión de usuarios, excepciones?¿?
Un saludo!!!
Hola _imc_
Respondiendo:
1) Zend_Loader::registerAutoload() sólo carga las clases que vas utilizando/instanciando, como ej:
Al crear la instancia de Zend_Registry, registerAutoload trabaja por detrás en forma automática y hace un include de la clase antes de instanciarla.
2) ¿Tu app esta en el root del servidor webo en una carpeta? ¿Agregaste los métodos ini() en los controladores?
En el link del home agrega al final “/”, después de $this->baseUrl.
saludos,
[...] semana pasada escribí un articulo sobre un Sitema de Login el cual continuaba con la linea del set de artículos Comenzando con Zend Framework con el fin de [...]
zsamer tiene razon el Zend_Loader::registerAutoload() solo carga las clases que va a utilizar por que es mas bien un gestor de clases mas que un simple cargador de clases, además Zend implementa el patron Singleton, que precisamente se encrga de instanciar la clase una sola vez, igual si no estas seguro pones simplemente un clearstatcache(); que se encarga de lipiar aquellas clases y objetos puedes definirlo en un metodo con el objetivo de Encapsularlo y que sea comprensible
public static function cargarClases(){
clearstatcache();
Zend_Loader::registerAutoload();
}
Nice Site!
http://google.com
Muchas gracias por el articulo, le he pegado un rápido vistazo y ya lo tengo en favoritos listo para, en cuanto tenga un rato, estudiarlo a fondo; he comenzado el otro día a estudiar ZF y lo que necesitaba eran ayudas como esta en castellano.
Gracias por esta ayuda, ahora lo que necesito saber es como juntar el sistema de login con las ACL.
[...] Tutoriales y documentación para trabajar con Zend Form abundan, así que no voy a profundizar en ello. [...]
hola……….
Muy buena pero yo estoy utilizando el zend framework 1.5 y quisiera que alguien me ayude a utilizar zend_auth y zend_acl pero en zf 1.5 ya que el orden es más estricto en esta versión por favor cualquier informacion es valido.
De ante mano muchas gracias………
Un detalle…
Hay una doble validación para el formulario, la primera esta en el controlador
$form->isValid($_POST)y la segunda en el modelo
if(!empty($nick) && !empty($password))Cuando se envian los dos campos vacios no pasa de la primer validación por lo tanto el mensaje q se muestra no es el nuestro sino el de ZF. No estoy muy al tanto de cuantas validaciones hace isValid() pero estimo q NO seria necesario usarlo en este caso, por favor si me equivoco soy todo ojos :0
Que tal muy buen block, estoy empezando en esto del zend segui todos los bloks que llevas hasta este donde me atore hice todo al pie de la letra pero me aparece el siguinte error y no tengo idea de que sea
Fatal error: Class ‘Zend_Auth’ not found in /var/www/Ejemplo/application/models/UserModel.php on line 231
espero me puedas orientar
hola jos tienes que tener en tu index.php o bootstrap esta linea Zend_Loader::registerAutoload();
saludos.
en verdad gracias me fue de mucha utilidad
Que tal zsamer mira ya esta corriendo el ejemplo del login pero tengo un problema los link estan rotos no sirven o se por que cuestion ya revise metodo init() y de todos modos no me fuciona estoy un poco desesperado espero me puedas ayudar
si le doy a about me manda a
http://localhost/Ejemplo/public/about
login me manda a
http://localhost/Ejemplo/public/user
y si le doy al otro login me manda
http://localhost/Ejemplo/public/user/login
de ante mano gracias
Que tal zsamer mira ya esta corriendo el ejemplo del login pero tengo un problema los link estan rotos no sirven o se por que cuestion ya revise metodo init() y de todos modos no me fuciona estoy un poco desesperado espero me puedas ayudar
si le doy a about me manda a
http://localhost/Ejemplo/public/about
login me manda a
http://localhost/Ejemplo/public/user
y si le doy al otro login me manda
http://localhost/Ejemplo/public/user/login
de ante mano gracias
¿te arroja un error?
¿que error aparece?
Son ejemplos básicos, la idea es que los links lo definan ustedes según lo que quieras hacer.
me aparece:
Not Found
The requested URL /quickstart/public/user/login was not found on this server.
pero no entiendo por que
Mmmm. Tu problemas es muy básico.
¿Instalaste el mod_rewrite en tu servidor?
¿te fijaste en el archivo .htaccess?
Vas a tener que repasar los post anteriores.
Te saltaste un paso o hiciste algo mal.
También puedes recurrir al manual oficial de ZF o Foros.
ok gracias en verdad muchas gracias
que tal buen dia estoy empezando en esto de zend en ubuntu ya hice todo pero me sale el siguiente erro
Fatal error: Uncaught exception ‘Zend_Session_Exception’ with message ‘Session must be started before any output has been sent to the browser; output started in /var/www/quickstart/application/models/UserModel.php/2′ in /var/www/quickstart/library/Zend/Session.php:407 Stack trace: #0 /var/www/quickstart/library/Zend/Session/Namespace.php(116): Zend_Session::start(true) #1 /var/www/quickstart/library/Zend/Auth/Storage/Session.php(87): Zend_Session_Namespace->__construct(’Zend_Auth’) #2 /var/www/quickstart/library/Zend/Auth.php(91): Zend_Auth_Storage_Session->__construct() #3 /var/www/quickstart/library/Zend/Auth.php(133): Zend_Auth->getStorage() #4 /var/www/Ejemplo/application/models/UserModel.php(231): Zend_Auth->hasIdentity() #5 /var/www/quickstart/application/controllers/UserController.php(23): UserModel::isLoggedIn() #6 /var/www/quickstart/library/Zend/Controller/Action.php(495): UserController->preDispatch() #7 /var/www/quickstart/library/Zend/Controller/Dispatcher/Standard.php(293): Zend_Controller_Action->dispatch(’loginA in /var/www/quickstart/library/Zend/Session.php on line 407
espero me puedad ayudar se los agradeceria muchisimo
es porque tienes una salida o output antes de finalizar el proceso o aplicación.
Revisa que no tengas ningún espacio en blanco en tus archivos php (revisarlos todos).
No pueden haber espacios antes de
"< ?php"ni tampoco después de"?>"Me parece interesante y bien estructurada la solución del artículo. Quisiera por otra parte consultarte algo que me ha estado molestando un poco de este framework y es que a la hora de ubicar visualmente los bloques/campos de un formulario en la capa de vista, el módulo zend_form es muy eficiente generando el layout uno debajo del otro o aplicando un determinado patrón (gracias a los decoradores) pero, si quiero ubicar algunos alineados al costado y otros debajo por ejemplo, ya no es tan sencillo. No puedo simplemente ubicar a mi gusto algunas variables en la capa de vista como haría con Smarty u otro framework de vista. La alternativa de usar sub-forms u otras vueltas haciendo el código del form más complejo para lograr el efecto deseado me resulta casi tan desprolijo como usar capas de CSS para reubicar los bloques/campos (digo bloques por componerse del campo propiamente dicho, mensaje de error y label). Este detalle planteado sobre los forms me complica a la hora de delegarle a otra persona el desarrollo de plantillas o el diseño gráfico del sistema. Agradezco cualquier sugerencia que puedas aportar o consideres pertinente. Saludos.
Revisa el manual, la solución es crear tu propia clase Decorator que extienda de Zend_Form_Decorator_Abstract y ahí haces el render a tu gusto.
Revisa esto:
Creating Custom Form Markup Using Zend_Form_Decorator
[...] semana pasada escribí un articulo sobre un Sitema de Login el cual continuaba con la linea del set de artículos Comenzando con Zend Framework con el fin de [...]
With the Industry’s Choice for MLM & Network Marketing Leads. Responsive Live Leads & network marketing leads. Recruit more distributors this month and put your home business into overdrive. Our focus is creating Total Prospecting Solutions for organizations and arrangement business companies.
Yo hice todo el ejemplo y me funciono de una, muchas gracias por sus aportes.
Tengo una pregunta, como hago para que en vez de que apareca el mensaje de que debe loguarse, me redireccione de una vez a la pagina del login?.
Hola Widipa, con ZF hay dos formas dentro del controlador:
$this->_redirect($miUrl);
$this->_forward($action, $controller, $module, $params);
te dejo el link en el manual oficial de ZF:
métodos útiles en controladores
Muy buenas. Además de almacenar los datos del usuario, almaceno en $_SESSION los datos que a mi mi apetezca. Hasta ahí todo ok. Pero al almacenar un array obtenido como retorno de una función, me da el siguiente error:
Fatal error: Uncaught exception ‘Zend_Session_Exception’ with message ‘Zend_Session::start() - C:\Archivos de programa\Apache Software Foundation\Apache2.2\htdocs\portalBiblioteca\library\Zend\Loader.php(Line:83): Error #2 Zend_Loader::include_once() [function.include]: Failed opening ‘Perfil.php’ for inclusion (include_path=’.;C:\Archivos de programa\Apache Software Foundation\Apache2.2\htdocs\portalBiblioteca/library;C:\Archivos de programa\Apache Software Foundation\Apache2.2\htdocs\portalBiblioteca/application/config;C:\Archivos de programa\Apache Software Foundation\Apache2.2\htdocs\portalBiblioteca/application/models;C:\Archivos de programa\Apache Software Foundation\Apache2.2\htdocs\portalBiblioteca/public;C:\Archivos de programa\Apache Software Foundation\Apache2.2\htdocs\portalBiblioteca/application/config;.;C:\php5\pear’) Array’ in C:\Archivos de programa\Apache Software Foundation\Apache2.2\htdocs\portalBiblioteca\library\Zend\Session.php:432 Stack trace: #0 C:\Archivos de program in C:\Archivos de programa\Apache Software Foundation\Apache2.2\htdocs\portalBiblioteca\library\Zend\Session.php on line 432
El trozo de código donde falla es este, creo:
$data =$authAdapter->getResultRowObject(null,’password’);
$auth->getStorage()->write($data); $miPerfil=$auth->getIdentity()->PERFIL; $permisos=$this->model->obtenerPermisos($miPerfil);
$_SESSION['permisos']=$permisos;
Si meto en $_SESSION cualquier cosa funciona ok, pero al introducir el array $permisos, da ese error, alguna idea??
gracias
holas zsamer un favor, mira tengo implementado el login al estilo del tuturial y funciona bien puedo logearme hace la validadcion y me muestra los datos del usuario pero mas no puedo deslogearme osea en mi navegador siempre se quedan las cookies y no se siguen mostrando todos los datos del usuario, cual crees pueda ser mi error?
pondre mi codigo aqui
esto en el login controller
public function loginAction() {
$form = new LoginForm();
if ($this->_request->isPost()) {
$credentials = $this->_request->getPost();
if ($form->isValid($credentials)) {
try{
$this->user->setMessage(’El nombre de Usuario y Password no coinciden.’, PersonaModel::NOT_IDENTITY);
$this->user->setMessage(’La contraseña ingresada es incorrecta. Inténtelo de nuevo.’, PersonaModel::INVALID_CREDENTIAL);
$this->user->setMessage(’Los campos de Usuario y Password no pueden dejarse en blanco.’, PersonaModel::INVALID_LOGIN);
$this->user->login($credentials['username'], $credentials['password']);
$this->_redirect(’index/login’);
} catch(Exception $e){
echo $responseLogin = $e->getMessage();
$this->_redirect(’index’);
}
$this->view->responseLogin = $responseLogin;
echo “erro “.$responseLogin;
}
}
}
y esto para la salida
public function logoutAction() {
$this->user->logout();
$this->loggedIn=false;
$this->_redirect(’/index’);
}
en el modelo de usuario
public function login($nick, $password)
{
if (! empty ( $nick ) && ! empty ( $password )) {
Zend_Loader::loadClass ( ‘Zend_Auth_Adapter_DbTable’ );
$autAdapter = new Zend_Auth_Adapter_DbTable ( self::getDefaultAdapter () );
$autAdapter->setTableName ( ‘persona’ );
$autAdapter->setIdentityColumn ( ‘identificador’ );
$autAdapter->setCredentialColumn ( ‘contrasenia’ );
$autAdapter->setIdentity ( $nick );
$autAdapter->setCredential ( md5 ( $password ) );
$autAdapter->setCredentialTreatment(” AND estado=’Activo’”);
$auth = Zend_Auth::getInstance ();
$result = $auth->authenticate ( $autAdapter );
switch ($result->getCode ())
{
case Zend_Auth_Result::FAILURE_IDENTITY_NOT_FOUND :
throw new Exception ( $this->_messages [self::NOT_IDENTITY] );
break;
case Zend_Auth_Result::FAILURE_CREDENTIAL_INVALID :
throw new Exception ( $this->_messages [self::INVALID_CREDENTIAL] );
break;
case Zend_Auth_Result::SUCCESS :
if ($result->isValid ()) {
$data = $autAdapter->getResultRowObject ();
$auth->getStorage ()->write ( $data );
} else {
throw new Exception ( $this->_messages [self::INVALID_USER] );
}
break;
default :
throw new Exception ( $this->_messages [self::INVALID_LOGIN] );
break;
}
} else {
throw new Exception ( $this->_messages [self::INVALID_LOGIN] );
}
return $this;
}
public static function logout()
{
Zend_Auth::getInstance()->clearIdentity();
Zend_Auth_Storage_Session::clear();
Zend_Session::expireSessionCookie();
return NULL;
}
hojala puedas darme una manito de todas formas te loagradesco
ah por sierto uso el zf 1.7
Sie haben eine sch?ne Seite!
Hola que tal, queria hacer una consulta, estoy revisando este login en Zend y me corre genial, pero como seria hacer el login con autorizacíon a vaios modulo con permisos de guest, users y admins, usando Zend ACL, Auth y DB, si tuvieras una manual o tutoeial por ahi me seria de mucha ayuda. Gracias
Hola amigos, la verdad soy nuevo en esto, un amigo tuvo el problema de:
Fatal error: Uncaught exception ‘Zend_Session_Exception’ with message ‘Session must be started before any output has been sent to the browser; output started
La verdad nos fastidiamos de estar buscando una salida de texto antes de iniciar la sesion, pero analizando poco a poco nos encontramos que si existia una salida de texto pero era por el error de la version del zend al usar el Zend auto Loader.
Antes estábamos usando:
include “Zend/Loader.php”;
Zend_Loader::registerAutoload();
Ahora usamos esto:
require_once ‘Zend/Loader/Autoloader.php’;
$loader = Zend_Loader_Autoloader::getInstance();
$loader->setFallbackAutoloader(true);
$loader->suppressNotFoundWarnings(false);
El tema lo encontre aqui:
http://phpsenior.blogspot.com/2009/05/por-actualizar-apurado-de-zf-17-18.html
Saludos espro a alguien mas le sirva.
Hola, felicidades por tu estupendo trabajo.
Estoy tratando de implementar un sistema de login que puede ser llamado desde distintos módulos y la verdad es que no se como conocer desde el modulo de autenticación desde donde ha sido llamado para volver a llevar al usuario al mismo sitio.
Un saludo.
Hola, soy nuevo en esto de Zend Framework asi que por favor tenganme pacienca….
Mi pregunta es la siguiente..
He visto que para manejar los usuarios, utiliza una tabla llamada users, ¿es posible que en ves de utilizar esa tabla utilice los usuarios creados en la BBDD? es decir, en el archivo quickstart.ini el usuario que establece la conexion con la BBDD es el usuario root; como tendria que hacer para que el usuario que se conecta con la BBDD sea el ingresado en el campo nick?.
desde ya muchas gracias.
Me gusta mucho la coleccion de tutoriales q tienes solo que no comprendo xq trabajas mucho con variables estaticas, hay un xq ?? o es te fue mas comodo trabajar con ellas. si Hay un porque pliss!! explicamelo
saluditos
Hola necesito una gran ayuda de uds.. estoy ciomenzando con zend y necesito hacer unos formularios dond cada boton tiene una funcion asociada. si alguien m puede ayudar con eso se lo agradeceria.. necesito un ejemplo para hacer esto si alguien tiene un enlace por favor..