February 27, 2006

setCredentials con Base de Datos

Algo que he notado en ocasiones, es que la gente tiene una cierta confusión a la hora de querer mezclar setCredentials con Base de Datos. Veamos un ejemplo mas claro usando MySQL. Antes de comenzar, seria bueno que se leyeran este par de entradas del blog :

Autentificación de usuarios con FlashRemoting y setCredentials

Uso de herencia en AMFPHP en conexiones a bases de datos


Ya con esta información en nuestra mente, procedamos. En primer lugar, veamos nuestra clase Config.php la cual nos ayuda a tener mejor organizadas nuestras conexiones a MySQL :

class Config {
   
    //-------------------------
    //Configuraciones MySQL
    var $dbhost = "localhost";
    var $dbname = "noticias";
    var $dbuser = "root";
    var $dbpass = "";
    //-------------------------
   

    function Config ($db) {
        if(basename($_SERVER['PHP_SELF']) == "Config.php") exit; //Esta línea es para evitar que accedan al archivo de manera pública.
        $this->conn = $this->connect($db);
    }

    function connect ($db) {
        if(!$conn = @mysql_pconnect($this->dbhost, $this->dbuser, $this->dbpass)) {
            return false;
        }
        if (!@mysql_select_db ($db, $conn)) {
            return false;
        }
        return $conn;
    }
   
    function log ($log) {
         $file = implode("", file("log.txt"));
         $open = fopen ("log.txt", "w+");
         $file .= date ("\l\o\g :::: d/m/Y h:m:s ----> ", time()).$log."\n";       
         fwrite ($open, $file);
         fclose ($open);
     }
    function _authenticate ($user,  $pass) {
         $user = addslashes($user); //escapamos las comillas para evitar un MySQL inyection...es por seguridad.
         $pass = addslashes($pass);
         $query = "SELECT `roles` FROM `users` WHERE `user` LIKE '".$user."' AND `password` LIKE '".$pass."';";
         $result = mysql_query ($query, $this->conn);
         if ($data = mysql_fetch_assoc($result)) {
              return $data['roles'];
         } else {
              return false;
         }

 }
}

Todo lo anterior, ya está explicado en uno de los links (a excepción del nuevo _authentificate que hemos creado), así que no es necesario repetir . Por otro lado, veamos nuestro servicio seguro :


include_once("Config.php");

class News extends Config {

     function News {
          parent::__construct($this->dbname);//Esta linea llama al constructor de la clase.
          $this->methodTable = array (
               "getNews" => array (
               "description" => "Devuelve el listado de noticias",
              "access" => "remote",
              "roles" => "admin",
               "arguments" => array ()
               )
          );
     }

     function getNews () {
          return "AsFusion es un blog mas en la blogosfera que intenta sobrevivir en este mundo cruel";
     }
}

Como verán, está mi clase News la cual hereda los métodos y propiedades de mi clase Config. Entre lo heredado, está obviamente mi método _authenticate el cual me validará a mi usuario en una supuesta tabla como esta :

user
password
roles
daniel
asfusion
admin
nahuel
coldfusion
admin


Básicamente mi método _authenticate me validará el usuario haciendo una consulta a la base de datos, y devolverá el rol de nuestro usuario seleccionado. Si este rol concuerda con lo especificado dentro de nuestro methodTable, se validará correctamente el usuario. No es díficil esto de combinar setCredentials con MySQL....solo se trata de aplicar un poco de lógica si es que antes hemos combinado FlashRemoting con Base de Datos. Este seria el código de Actionscript :

import mx.remoting.Service;
import mx.services.Log;
import mx.rpc.RelayResponder;
import mx.rpc.FaultEvent;
import mx.rpc.ResultEvent;
import mx.remoting.PendingCall;

var sSecured:Service = new Service ("http://localhost/gateway.php", null,"News",null,null);
sSecured.connection.setCredentials ("daniel", "asfusion");

function welcomeResult (rs:ResultEvent) {
     trace (rs.result);
}

function welcomeFault (fl:FaultEvent) {
     trace("Su usuario no esta validado");
     trace("Hubo un problema: "+fl.fault.faultstring);
     trace("El código del error es: "+fl.fault.faultcode);
     trace("Detalles: "+fl.fault.detail);
}

var pcWelcome:PendingCall = sSecured.welcome ();
pcWelcome.responder = new RelayResponder (this, "welcomeResult", "welcomeFault");


Algo a destacar, es que también si queremos agregarle un poco más de seguridad a nuestra aplicación, podemos encriptar el password en la base de datos usando md5. Entonces nuestra validacioón quedaría así :

    function _authenticate ($user,  $pass) {
         $user = addslashes($user); //escapamos las comillas para evitar un MySQL inyection...es por seguridad.
         $pass = md5($pass); //Encriptamos el password previamente.
         $query = "SELECT `roles` FROM `users` WHERE `user` LIKE '".$user."' AND `password` LIKE '".$pass."';";
         $result = mysql_query ($query, $this->conn);
         if ($data = mysql_fetch_assoc($result)) {
              return $data['roles'];
         } else {
              return false;
         }

     }

Espero haber aclarado un poco más este tema, y que esto sea de gran ayuda a cualquiera que desee enfocarse plenamente a FlashRemoting.

Saludos¡


Comentarios

This info is very good. Thanks for your works :)

Maybe You should use also mysql_escape_string()?

it doesn't work:(( i have fatal error

<a href="http://viziwe.com">riwopa</a>; | [url=http://pinoru.com]ruhywi[/url] | [link=http://vyxuwa.com]zohiku[/link] | http://wuwoco.com | kuhexu | [http://puvyzu.com xywepo]

La verdad es que yo tenia problemas antes con setCredentials, pero que bien que he encontrado este blog!!Gracias. Y muy util la funcion md5

La verdad es que yo tenia problemas antes con setCredentials, pero que bien que he encontrado este blog!!Gracias. Y muy util la funcion md5

thanks fo great tips. Saludos.

Muchas Gracias

I agree - great tips

Great tips

Muchas Gracias de Novo sancti petri

Great

Bardzo ciekawe rozwiazanie mojego autorskiego pomyslu. I just found it! Thank's.


Sorry to byl pomysl mojego kolegi, mimo to ten skrypt jest naprawde znakomity.

Nice

A mi me encanta.

Thanks.

nice.

Thanks