miércoles, 20 de octubre de 2010

Kumbiaphp : Login de la aplicacion utilizando una cuenta de correo [ phpmail ]

Supongamos que ud. tiene una empresa, y adquiere un hosting LAMP, como saben les dan un servidor de correo, ahora en ese hosting va a montar una aplicacion la cual usarán solo los empleados de su empresa que tienen una cuenta de correo en el mismo servidor.
Entonces no seria lo ideal que sus trabajadores se logueen en la aplicacion utilizando su cuenta y password de correo ?. Bueno en este post veremos como hacer eso.
Utilizaremos la clase phpmail y como siempre nuestro framework Kumbiaphp



Vamos a hacerlo rapido y sencillo. La idea es que sus usuarios ingresen a la aplicacion utilizando sus cuentas de  email.
En Kumbiaphp 1.0 dentro de la carpeta [miapp]/core/libs/auth encontraremos las librerias que gestionan la autenticacion a la aplicacion, vamos a abrir el archivo auth.php
Dentro de ese archivo nos ubicaremos en la funcion
public function set_adapter ($adapter, $auth = null, $extra_args = array())

En la condicional agregaremos al array el elmento smtp , tal como se muestra en el codigo inferior
public function set_adapter ($adapter, $auth = null, $extra_args = array())
    {
        if (! in_array($adapter, array('digest' , 'http' , 'model' , 'kerberos5' , 'radius', 'smtp'))) {
            throw new kumbiaException("Adaptador de autenticación '$adapter' no soportado");
        }
        $this->adapter = Util::camelcase($adapter);
        require_once CORE_PATH . "libs/auth/adapters/{$adapter}_auth.php";
        $adapter_class = $this->adapter . 'Auth';
        $this->extra_args = $extra_args;
        $this->adapter_object = new $adapter_class($auth, $extra_args);
    }

Bien por ahora lo que hemos hecho es decir a la clase auth que existe otro metodo de autenticacion el cual lo hemos denominado smtp, ahora debemos implementarlo.
Para esto vamos a ingresar a la carpeta  [miapp]/core/libs/auth/adapters y crearemos el archivo smtp_auth.php
En este archivo nos centraremos en el metodo autenticar.
Cargamos la libreria phpmailer, luego verificamos que se encuentren los atributos necesarios esto es login, password y server, configuramos la conexion smtp ha utilizar, asignamos el usuario y password a $mail->Username y $mail->Password respectivamente, con el metodo $mail->SmtpConnect() comprobamos la autenticacion, una vez hecho esto en el objeto identity ponemos los datos de nuestro usuario si fuera necesario.
public function authenticate ()
 {
  Load::lib("phpmailer");
  $result=null;  
  if( $this->compare_attributes['login']!="" && $this->compare_attributes['password']!="" && $this->compare_attributes['server']!=""){//comprobar existencia de parametros         
   $login=$this->compare_attributes['login'];
   $password=$this->compare_attributes['password'];
   $server=$this->compare_attributes['server'];  
   
   /**
   * Configuramos la conexion con el SMTP
   */
   $mail=new phpmailer();  
   $mail->Mailer = "smtp";
   $mail->Host = "$server";
   $mail->Port = 25;
   $mail->SMTPAuth = true;
   
   $domain=substr($server,5);
   
   $mail->Username = "$login@$domain"; // SMTP username
   $mail->Password = "$password"; // SMTP password
   
   /**
   * Valido los datos con la funcion SmtpConnect()
   */
   try{    
    if($mail->SmtpConnect()==true){      
     $identity = array();      

$result=$true;      
     foreach ($usuario->fields as $field) {
      /**
       * Trata de no incluir en la identidad el password del usuario
       */
      if (! in_array($field, array('password' , 'clave' , 'contrasena' , 'passwd' , 'pass'))) {
       $identity[$field] = $usuario->$field;
      }       
     }
    }
    $this->identity = $identity;    
   }catch(phpmailerException $ex){
    Flash::error($ex->errorMessage() . "[$mail->Username | Server: $mail->Host]" );
   }   
  }  
  return $result;
 }
Como veran no aparece la asignacion a $usuario porque eso ya depende de uds. puede hacerse con una llamada a la BD como $usuario=ActiveRecord::get($this->class)->find_by_login($login);

Como ven no es dificil ahora se preguntaran como se llama, bueno, supongamos que tienen un controlador login_controller.php y dentro una accion denominada autenticar algo asi:
Funcion autenticar del controlador Login
    public function autenticar(){

        if($this->has_post('user')){
            
            $usuario=trim($this->post('user.login'));            
            $pwd=trim($this->post('user.password'));
            
            $server="mail.miservidor.com";
                        
            $auth = new Auth("smtp", "server: $server","class: usuario", "login: $usuario", "password: $pwd");
            if ($auth->authenticate()) {               
                $this->redirect("usuario/workspace");
            } else {                
                $this->redirect("usuario/autenticar");
            }
        }
    }
Y por ultimo, gracias a mi amigo José que me avisó, vamos a poner la vista, que debiera estar en [miapp]/login/autenticar tal como se ven en el controlador este formulario se carga mientras no se halla enviado por el método post la el array user.
Vista : autenticar.phtml
<?php View::content(); ?>
<div id="login" style=" width:33%;">
 <?php echo form_tag("usuario/autenticar/") ?> 
  <fieldset>
   <legend>Ingreso al Sistema</legend>
   <br />
   <label>Usuario</label>
   <?php echo text_field_tag(array('user.login')) ?>
   <strong>@</strong>
   <br/><br/>
   <label>Clave</label>
   <?php echo password_field_tag(array('user.password')) ?>   
   <br/><br/>
   <?php echo submit_tag("Aceptar","id: save", "class: aceptar")?>
  </fieldset>  
 </form>
</div>

Con lo que tendremos un formulario similar a este:

Bueno espero haber sido lo bastante explicativo, hasta otra entrada.

2 comentarios:

  1. muy interesante el articulo...lo dejo marcado en mis favoritos :)

    ResponderEliminar
  2. Gracias ^_^, me alegra que te haya parecido interesante, pronto estare posteando mas sobre el mismo tema

    ResponderEliminar

 
Powered by Blogger