Ver Mensaje Individual
  #2 (permalink)  
Antiguo 26/09/2011, 13:37
Avatar de Webstudio
Webstudio
Colaborador
 
Fecha de Ingreso: noviembre-2001
Ubicación: 127.0.0.1
Mensajes: 3.499
Antigüedad: 22 años, 6 meses
Puntos: 69
Respuesta: Clase 'users'. ¿Es correcta?

Hola. como estás?
Si bien como concepto tu clase User está bien, me parece que una clase de Usuario que se encarga de la autenticación es como que está mezclando dos cosas en un solo objeto.
Dejame proponerte una versión alternativa, y vos me decís, dale?
Por un lado como dejaría yo la jerarquía de clases:
Código PHP:
Ver original
  1. <?php
  2.  
  3. /**
  4.  * Tu clase "Usuario" no es más que un simple modelo que representa los valores
  5.  * de un usuario dentro de tu sistema. Para el resto de las cosas, podés utilizar
  6.  * un Mapper que te permita "persistir" Usuarios en donde vos quieras.
  7.  */
  8. class User
  9. {
  10.     protected $_isLoged   = false;
  11.  
  12.     protected $dni       = 0;
  13.     protected $id        = 0;
  14.     protected $pass      = '';
  15.     protected $control   = '';
  16.     protected $rol       = 'user';
  17.     protected $email     = '';
  18.     protected $apellidos = '';
  19.     protected $nombre    = '';
  20.  
  21.     public function loadByArray(array $u)
  22.     {
  23.         $u = (object) $u;
  24.  
  25.         $this->dni = $u->dni;
  26.         $this->id = $u->id;
  27.         $this->pass = $u->pass;
  28.         $this->control = $u->control;
  29.         $this->rol = $u->rol;
  30.         $this->email = $u->email;
  31.         $this->apellidos = $u->apellidos;
  32.         $this->nombre = $u->nombre;
  33.  
  34.         return $this;
  35.     }
  36. }
  37.  
  38. /**
  39.  * El Mapper es el objeto encargado de guardar objectos User
  40.  * donde mejor te venga en gana. Este en particular, lo guarda
  41.  * en la base de datos utilizando un Model en particular,
  42.  * pero podrías guardar usando un web-service o MemCache.
  43.  */
  44. class UserMapper extends Model
  45. {
  46.  
  47.     static public function getByDni($dni)
  48.     {
  49.         /* Asumo que este find_one() devuelve un array */
  50.         $u = $this->factory('Users')->where('dni', $dni)->find_one();
  51.         $user = new User();
  52.         return $user->loadByArray($u);
  53.     }
  54.  
  55.     /**
  56.      * Este método no es necesario, directamente podés utilizar la
  57.      * instrucción "clone" de PHP, de esta manera:
  58.      * $newUser = clone $oldUser;
  59.      */
  60.     public function cloneU($u) {
  61.         $this->dni = $u->dni;
  62.         $this->id = $u->id;
  63.         $this->pass = $u->pass;
  64.         $this->control = $u->control;
  65.         $this->rol = $u->rol;
  66.         $this->email = $u->email;
  67.         $this->apellidos = $u->apellidos;
  68.         $this->nombre = $u->nombre;
  69.  
  70.     }
  71.  
  72.     /**
  73.      * Este método, en vez de recibir los valores sueltos,
  74.      * debería recibir un objecto User ya cargado con sus
  75.      * valores, listo para guardar
  76.      */
  77.     static public function save(User $user)
  78.     {
  79.         /* Si necesitás modificar algo antes de grabar, lo hacés acá */
  80.         $user->cambiosNecesarios();
  81.  
  82.         /* Usas tu Model para guardarlo */
  83.         Model::factory('Users')->save($user);
  84.         return $user;
  85.     }
  86.  
  87. }
  88.  
  89. /**
  90.  * Finalmente, esta clase es la que se encarga de hacer el trabajo
  91.  * sucio a la hora de validar usuarios dentro de tu sistema. De
  92.  * esta manera, mantenés un objeto User lo más limpio posible, y
  93.  * delegás las funcionalidades específicas, a Clases específicas.
  94.  */
  95. class Authentication
  96. {
  97.  
  98.     static public function logout() {
  99.         //Borramos las cookies
  100.         setcookie('login','');
  101.         setcookie('rol','');
  102.         setcookie('user', '');
  103.         //El mismo borrará los datos de la sesion al recargar la pag!
  104.         //session_unset();
  105.     }
  106.  
  107.     public function islog(User $user) {
  108.         return $user->_isLoged;
  109.     }
  110.  
  111.     //Método para loguear en el sistema
  112.     public function auth($dni, $pass) {
  113.         $user = UserMapper::getByDni($dni);
  114.  
  115.         if(!$user) return false; //No existe el usuario!
  116.  
  117.         if(md5($pass) == $user->pass) {
  118.             $cookie = Authentication::_getCookieName($user);
  119.             setcookie('login',$cookie);
  120.             setcookie('user',$user->dni);
  121.             setcookie('rol',$user->rol);
  122.  
  123.             return $user;
  124.         }
  125.  
  126.         return false;
  127.     }
  128.  
  129.     //Método para, con dos valores de las cookies, comprobar si es correcto!
  130.     static public function authByCookie($dni, $login) {
  131.  
  132.         $userN = UserMapper::getByDni($dni);
  133.  
  134.         /* Mejor invertir la condición, para evitar If anidados */
  135.         if( !$userN ) {
  136.             Authentication::logout();
  137.             return false;
  138.         }
  139.  
  140.         $cookie = Authentication::_getCookieName($userN);
  141.  
  142.         if($cookie != $login) {
  143.             $this->logout();
  144.             return false;
  145.         }
  146.  
  147.         return $userN->_islog = true;
  148.     }
  149.  
  150.     /**
  151.      * Mejor tener un método que te devuelva el cookie name encriptado
  152.      * asi evitas tener en dos lugares tu palABRAmagica ;)
  153.      */
  154.     static protected function _getCookieName($user)
  155.     {
  156.         $name = $user->dni . $user->pass . $_SERVER['REMOTE_ADDR'];
  157.         $name.= $user->rol . 'pAlABRAmagica';
  158.         return md5($name);
  159.     }
  160. }

Y luego unos ejemplos de uso básicos, ya vos los podrás adaptar a tus casos de uso más personales :
Código PHP:
Ver original
  1. // Obtenemos un usuario ya existente
  2. $user = UserMapper::getByDni('26965061');
  3.  
  4. // Lo modificamos y grabamos
  5. $user->nombre = 'Pablo';
  6. UserMapper::save($user);
  7.  
  8. /* Si tuvieramos en un array todos los datos de un usuarios
  9.    y lo queremos guardar en la base de datos */
  10. $user = new User;
  11. UserMapper::save($user->loadByArray($datos));
  12.  
  13. /* Si tenés DNI y PASS de un usuario, y querés saber si existe */
  14. if($user = Authentication::auth('26965061', 'pepelepu')) { // Si, va un solo igual
  15.     var_dump($user);
  16. }
  17.  
  18. /* Y si querés saber si el usuario que está logueado, es uno válido */
  19. if($user = Authentication::authByCookie($_COOKIE['dni'], $_COOKIE['cookie']) {
  20.     var_dump($user);
  21. }

Te lo dejo para que lo revises y me digas que pensás. Seguramente tiene algún error de sintaxis, o quizás de objetos y todo, pero sucede que lo tipee mientras iba modificando. Cualquier cosa lo vamos mejorando de a poco.

Abrazos !
__________________
Tutoriales Photoshop | Web-Studio.com.ar
Artículos PHP | ZonaPHP.com