Foros del Web » Programando para Internet » PHP » Zend »

Verificar sesion

Estas en el tema de Verificar sesion en el foro de Zend en Foros del Web. Buenas tardes por favor si me pueden ayudar, yo tengo lo siguiente para autenticarme Código PHP: $authAdapter  =  $this -> getAuthAdapter ();                  $login_usr  =  ...
  #1 (permalink)  
Antiguo 26/04/2013, 16:11
 
Fecha de Ingreso: septiembre-2010
Mensajes: 111
Antigüedad: 14 años, 3 meses
Puntos: 0
Verificar sesion

Buenas tardes por favor si me pueden ayudar, yo tengo lo siguiente para autenticarme
Código PHP:
$authAdapter $this->getAuthAdapter();

                
$login_usr $form->getValue('login_usr');
                
$password_usr $form->getValue('password_usr');

                
$authAdapter->setIdentity($login_usr)
                        ->
setCredential(sha1($password_usr));
                        

                
$auth Zend_Auth::getInstance();
                
$result $auth->authenticate($authAdapter); 
y verifico si esta autentifico con lo siguiente

Código PHP:
 if (Zend_Auth::getInstance()->hasIdentity()) {
            
$cod_tipo Zend_Auth::getInstance()->getStorage()->read()->COD_TIPO_USR;
            
$tipo_usr $model_tipo_usr->getTipoUsuario($cod_tipo);
            
$rol $tipo_usr['TIPO_USR'];
            
$this->_redirect('/' $rol);
        } 
y para los accesos utilizo los acl.
la pregunata en cada controlado o cada accion vista que estan entrando tengo que preguntar si esta autenticado o loqueado si no lo esta mandar autenticarse, no si me dejo entender, por favor si me pueden dar una idea

les estare agradecido
  #2 (permalink)  
Antiguo 26/04/2013, 22:15
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 6 meses
Puntos: 2135
Respuesta: Verificar sesion

¿Cual es tu duda? ¿Si en cada controller tienes que verificar? Si es eso, la respuesta es sí, por eso lo mejor es poner un Controller Plugin que se ejecute antes y ahí verificas.

Saludos.
  #3 (permalink)  
Antiguo 29/04/2013, 12:59
 
Fecha de Ingreso: septiembre-2010
Mensajes: 111
Antigüedad: 14 años, 3 meses
Puntos: 0
Respuesta: Verificar sesion

gracias por la respuesta, y donde coloco el controller plugin en que parte, para que se ejecute antes y verificar solo una vez para todo, gracias saludos
  #4 (permalink)  
Antiguo 29/04/2013, 13:09
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 6 meses
Puntos: 2135
Respuesta: Verificar sesion

Así es, lo puedes hacer en el preDispatch() justamente para que se ejecute antes que todos tus controllers.

Saludos.
  #5 (permalink)  
Antiguo 30/04/2013, 06:09
 
Fecha de Ingreso: abril-2013
Mensajes: 82
Antigüedad: 11 años, 8 meses
Puntos: 0
Respuesta: Verificar sesion

Hola, yo estoy teniendo problemas con esto. Siguiendo este tutorial [URL="http://otroblogmas.com/zend_auth-identificacion-y-autentificacion-en-zend-framework/"][/URL] he creado este plugin

application/plugins/CheckAccess.php:

Código PHP:
Ver original
  1. <?php
  2. class Plugin_CheckAccess extends Zend_Controller_Plugin_Abstract
  3. {
  4.     /**
  5.      * Contiene el objeto Zend_Auth
  6.      *
  7.      * @var Zend_Auth
  8.      */
  9.     private $_auth;
  10.  
  11.     /**
  12.      * El objeto de la clase singleton
  13.      *
  14.      * @var Plugin_CheckAccess
  15.      */
  16.     static private $instance = NULL;
  17.  
  18.     /**
  19.      * Constructor
  20.      */
  21.     private function __construct()
  22.     {
  23.         $this->_auth =  Zend_Auth::getInstance();
  24.     }
  25.  
  26.     /**
  27.      * Devuelve el objeto de la clase singleton
  28.      *
  29.      * @return Plugin_CheckAccess
  30.      */
  31.     static public function getInstance() {
  32.        if (self::$instance == NULL) {
  33.           self::$instance = new Plugin_CheckAccess ();
  34.        }
  35.        return self::$instance;
  36.     }
  37.     /**
  38.      * preDispatch
  39.      *
  40.      * Funcion que se ejecuta antes de que lo haga el FrontController
  41.      *
  42.      * @param Zend_Controller_Request_Abstract $request Peticion HTTP realizada
  43.      * @return
  44.      * @uses Zend_Auth
  45.      *
  46.      */
  47.     public function preDispatch(Zend_Controller_Request_Abstract $request)
  48.     {
  49.         $controllerName = $request->getControllerName();
  50.  
  51.         // Si el usuario esta autentificado
  52.         if ($this->_auth->hasIdentity()) {
  53.  
  54.         } else {
  55.             // Si el Usuario no esta identificado y no se dirige a la página de Login
  56.             if ($controllerName != 'login') {
  57.                 // Mostramos al usuario el Formulario de Login
  58.                 $request->setControllerName("login");
  59.                 $request->setActionName("index");
  60.             }
  61.         }
  62.     }
  63. }

En aplication.ini he agregado

Código:
resources.frontController.plugins.CheckAccess = "Plugin_CheckAccess"
Y en el action del controlador que quiera usar el plugin tengo que agregar esto no es así?

Código:
$frontController = Zend_Controller_Front::getInstance();
    $frontController->registerPlugin(new Plugin_CheckAccess());
Me aparece este error Fatal error:

Class 'Plugin_CheckAccess' not found in C:\xampp\xampp\php\PEAR\Zend\Application\Resource\ Frontcontroller.php on line 117

No tengo ni idea de por qué me aparece...
  #6 (permalink)  
Antiguo 30/04/2013, 08:56
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 6 meses
Puntos: 2135
Respuesta: Verificar sesion

El nombre de tu clase tiene que ser igual a tu namespace, si estas usando el defecto, sería Application_Plugin_CheckAccess, y con que lo pongas en el application.ini es suficiente, no necesitas volver a registrarlo en tu ActionController.

Ahora no entiendo porque lo quieres hacer un singleton, eso esta mal, ya que el resource del frontController va a intentar crear la clase y te va a dar error, quita el singleton para que se registre correctamente.

Saludos.
  #7 (permalink)  
Antiguo 30/04/2013, 09:36
 
Fecha de Ingreso: abril-2013
Mensajes: 82
Antigüedad: 11 años, 8 meses
Puntos: 0
Respuesta: Verificar sesion

Vale gracias, ya me funciona perfectamente.

Ahora si no es mucha molestia tengo otra pregunta... Quiero restringir el acceso dependiendo del usuario a que sea a ciertos sitios. He estado leyendo y he visto que tengo que hacerlo con zend_acl, pero no me aclaro del todo. Me explico.

En mi base de datos tengo 3 tablas, una para clientes, otra para empleados y otra para administradores. Cuando se introducen el usuario y la contraseña en el formulario de mi controlador login lo que hago es esto.


Código PHP:
Ver original
  1. $form = new Application_Form_Loginform();
  2.  
  3.        $this->view->form = $form;
  4.  
  5.        if($this->getRequest()->isPost()){
  6.  
  7.             $formData = $this->getRequest()->getPost();
  8.            
  9.             if($form->isValid($formData)){
  10.                
  11.                 $authAdapter = new Zend_Auth_Adapter_DbTable();
  12.                 $authAdapter->setTableName('cliente');
  13.  
  14.                 $authAdapter->setIdentityColumn('dni');
  15.                 $authAdapter ->setCredentialColumn('password');
  16.  
  17.                 $authAdapter->setIdentity($form->getValue('username'));
  18.                 $authAdapter->setCredential(($form->getValue('password')));
  19.  
  20.                 //obtiene la instancia del patron singleton
  21.                 $auth = Zend_Auth::getInstance();
  22.  
  23.                 $result = $auth->authenticate($authAdapter);
  24.  
  25.        
  26.                 if($result->isValid()){
  27.                     $this->_redirect('/cliente/index');
  28.                 }else{
  29.                     $authAdapter = new Zend_Auth_Adapter_DbTable();
  30.                     $authAdapter->setTableName('administrador');
  31.                     $authAdapter->setIdentityColumn('dni');
  32.                     $authAdapter ->setCredentialColumn('password');
  33.  
  34.                     $authAdapter->setIdentity($form->getValue('username'));
  35.                     $authAdapter->setCredential(($form->getValue('password')));
  36.  
  37.                     //obtiene la instancia del patron singleton
  38.                     $auth = Zend_Auth::getInstance();
  39.  
  40.                     $result = $auth->authenticate($authAdapter);
  41.  
  42.                     if($result->isValid()){
  43.                     $this->_redirect('/admin/index');
  44.                     }else{
  45.                         $authAdapter = new Zend_Auth_Adapter_DbTable();
  46.                         $authAdapter->setTableName('empleado');
  47.                         $authAdapter->setIdentityColumn('dni');
  48.                         $authAdapter ->setCredentialColumn('password');
  49.  
  50.                         $authAdapter->setIdentity($form->getValue('username'));
  51.                         $authAdapter->setCredential(($form->getValue('password')));
  52.  
  53.                         //obtiene la instancia del patron singleton
  54.                         $auth = Zend_Auth::getInstance();
  55.  
  56.                         $result = $auth->authenticate($authAdapter);
  57.  
  58.                         if($result->isValid()){
  59.                         $this->_redirect('/empleado/index');
  60.                         }else{
  61.                             $this->_helper->flashMessenger->addMessage(array('error'=>'Usuario o contraseña incorrectos'));
  62.                         }
  63.                     }


Ahora lo que quiero crear son los roles de: 'cliente','empleado','administrador'
y los recursos que voy a tener van a ser:
cliente controler al que quiero que puedan acceder a todos los actions los perfiles con rol cliente.

empleado controler al que quiero que puedan acceder a todos los actions los perfiles con rol empleado.

administrador controler al que quiero que puedan acceder a todos los actions los perfiles con rol administrador.

Mis preguntas son: ¿cómo puedo asignar a $auth el rol que tiene?

¿Puedo comprobar en el mismo plugin que he creado si el rol que tiene esta intentado acceder a un recurso que se le ha asignado?

¿Dónde tengo que crear mi Zend_Acl?
  #8 (permalink)  
Antiguo 30/04/2013, 10:23
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 6 meses
Puntos: 2135
Respuesta: Verificar sesion

Pues tendrías que evaluar en cada parte de tu if, el rol al que pertenece y guardarlo en una sesión es lo más sencillo.

Lo más adecuado es crear tu Acl en el bootstrap, y guardarlo en un registro para que lo puedas leer en tu plugin, o pasarlo como parámetro a tu plugin, ya depende de ti, para que justo en el plugin valides por el rol.

Saludos.
  #9 (permalink)  
Antiguo 30/04/2013, 12:45
 
Fecha de Ingreso: abril-2013
Mensajes: 82
Antigüedad: 11 años, 8 meses
Puntos: 0
Respuesta: Verificar sesion

Ya me funciona. Al final modifique las tres tablas que tenía y las puse en una añadiendole el campo rol. Pero me funciona perfecto. ¡Gracias!
  #10 (permalink)  
Antiguo 30/04/2013, 17:02
 
Fecha de Ingreso: septiembre-2010
Mensajes: 111
Antigüedad: 14 años, 3 meses
Puntos: 0
Respuesta: Verificar sesion

Sobre verificar el acceso para todos en un PreDispach, cree una clase verificar acceso en la carpeta plugins la clase es la siguiente
Código PHP:
class Plugin_VerificarAcceso extends Zend_Controller_Plugin_Abstract{
    private 
$_acl null;

    public function 
__construct(Zend_Acl $acl) {
        
$this->_acl $acl;
    }

    public function 
preDispatch(Zend_Controller_Request_Abstract $request) {
        
//print_r($request);
        
$module strtoupper($request->getModuleName());
        
$controller strtoupper($request->getControllerName());
        
$action strtoupper($request->getActionName());
        
$resource=$module.':'.$controller
es la forma correcta por favor corregir si me equivoco gracias
  #11 (permalink)  
Antiguo 30/04/2013, 20:14
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 6 meses
Puntos: 2135
Respuesta: Verificar sesion

Lee el tema, es justo lo que le dije a @mandygr87, el nombre de tu clase esta mal.

Saludos.
  #12 (permalink)  
Antiguo 02/05/2013, 21:27
 
Fecha de Ingreso: septiembre-2010
Mensajes: 111
Antigüedad: 14 años, 3 meses
Puntos: 0
Respuesta: Verificar sesion

muchas gracias Gator, saludos

Etiquetas: verificar
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 21:55.