Ver Mensaje Individual
  #5 (permalink)  
Antiguo 15/02/2010, 06:51
Nisrokh
 
Fecha de Ingreso: septiembre-2009
Ubicación: Neuquén
Mensajes: 142
Antigüedad: 15 años, 1 mes
Puntos: 12
Respuesta: [APORTE] Sistema de Sesiones y Autentificación de usuario con MySQL

Cosas que deberán modificar:

1) La variable SimpleLogin::$auth_salt, en el archivo SimpleSession.php tienen que poner su propio salt, si desean encryptar las claves con crypt(), si quieren utilizar otro metodo sientanse libres de ir al metodo SimpleLogin::login() y cambiar este detalle...
2) En las consultas MySQL, los nombres de las tablas "_sessions" y "_users" se toman desde el arreglo (array) SimpleMySQL::$tables Solo deben armar ese arreglo de la siguiente manera para no tener que modificar todas las consultas... (Al menos para probarlo...)

Código PHP:
Ver original
  1. <?php
  2.  
  3. // Tablas
  4. $_TABLES = array(
  5.     'users' => '_users',
  6.     'sessions' => '_sessions'
  7. );
  8.  
  9. $MySQL = new SimpleMySQL('mysql_server', 'mysql_user', 'mysql_pass');
  10. $MySQL->select_db('mysql_db_name');
  11. $MySQL->tables = $_TABLES;
  12.  
  13. ?>

3) Modifiquen a su gusto las llaves para utilizar mcrypt, para encryptar los datos de la sesion... En el archivo SimpleSession.php, al principio van a ver la definicion de estas dos constantes: SESSION_DATA_ENCRYPTION_KEY_1 y SESSION_DATA_ENCRYPTION_KEY_2

4) Pueden modificar el nombre del COOKIE enviado para las sesiones y la duracion:
SimpleSession::$name // Default: __SESSID
SimpleSession::$lifetime // Default: 1800 (30 minutos)

Una ves creado la base de datos con las tablas, ya podemos probar todo:
test.php
Código PHP:
Ver original
  1. <?php
  2.  
  3. include 'SimpleMySQL.php';
  4. include 'SimpleSession.php';
  5.  
  6. // Creamos instancia de SimpleMySQL
  7. $SimpleMySQL = new SimpleMySQL('localhost', 'root', 'pass');
  8. $SimpleMySQL->select_db('test');
  9. $SimpleMySQL->tables = array(
  10.     'users' => '_users',
  11.     'sessions' => '_sessions'
  12. );
  13.  
  14. // Creamos instancia de SimpleSession, pasando como unico argumento,
  15. // la instancia de SimpleMySQL
  16. $SimpleSession = new SimpleSession($SimpleMySQL);
  17. $SimpleSession->start();
  18.  
  19. if ((bool)$_POST['login'])
  20.     $SimpleSession->login($_POST['username'], $_POST['password']);
  21.  
  22. if (isset($_GET['logout']))
  23.     $SimpleSession->logout();
  24.  
  25. $_SESSION_ERROR = array(
  26.     1 => 'La contraseña no coincide con el nombre de usuario ingresado.',
  27.     2 => 'El nombre de usuario ingresado es inexistente.',
  28.     3 => 'La cuenta con la que usted está tratando de ingresar, no está autorizada para acceder al área de administración.',
  29.     4 => 'La cuenta con la que usted está tratando de ingresar, aún no ha sido validada. <br />Si usted es el dueño de esta cuenta, puede validarla haciendo clic <a href="#" class="blue">aquí</a>.',
  30.     5 => 'La cuenta con la que usted está tratando de ingresar ha sido bloqueada por un administrador.',
  31.     6 => 'No ha ingresado su nombre de usuario.',
  32.     7 => 'No ha ingresado su contraseña.',
  33.     8 => 'Se ha producido un error interno desconocido. Por favor, intente más tarde.'
  34. );
  35.  
  36. // Si hay un error lo imprimimos
  37. if ($SimpleSession->status > 0) {
  38.     print '<p style="color: red;">' .$_SESSION_ERROR[$SimpleSession->status]. '</p>';
  39. }
  40.  
  41. if ($SimpleSession->logged_in()) {
  42. ?>
  43. <h4>Bienvenido, <span style="color: red;"><?php print $SimpleSession->data->account_name ?></span></h4>
  44. <p>ID de sesión: <strong><?php print $SimpleSession->id ?></strong><br />ID de usuario: <strong><?php print $SimpleSession->data->account_id ?></strong><br /><a href="?logout">Cerrar sesi&oacute;n</a></p>
  45. <h4>Datos almacenados en la superglobal $_SESSION</h4>
  46. <pre>
  47. <?php print_r($_SESSION) ?>
  48. </pre>
  49. <p><strong>Nota</strong>: Se pueden llamar y almacenar dato en $_SESSION a travé del objeto SimpleSessionData de la siguiente manera:</p>
  50. <pre>
  51. $SimpleSession->data->foo = 'bar';
  52.  
  53. // Lo cual es lo mismo a hacer:
  54.  
  55. $_SESSION['foo'] = 'bar';
  56.  
  57. // Por ahi les paresca tonto pero al menos ami
  58. // Siempre me parecio mas facil manejar variables
  59. // en forma de objeto que arreglos...
  60. </pre>
  61. <?php
  62. } else {
  63. ?>
  64. <fieldset style="display: inline-block;">
  65.     <legend>Prueba de SimpleSession</legend>
  66.     <form method="post">
  67.         <input type="hidden" name="login" value="1" />
  68.         <table>
  69.             <tr>
  70.                 <td><label for="username">Usuario</label></td>
  71.                 <td><input type="text" id="username" name="username" maxlength="16" /></td>
  72.             </tr>
  73.             <tr>
  74.                 <td><label for="password">Contrase&ntilde;a</label></td>
  75.                 <td><input type="password" id="password" name="password" maxlength="16" /></td>
  76.             </tr>
  77.             <tr>
  78.                 <td>&nbsp;</td>
  79.                 <td><input type="submit" value="Iniciar sesi&oacute;n" /></td>
  80.             </tr>
  81.         </table>
  82.     </form>
  83. </fieldset>
  84. <?php
  85. }
  86.  
  87. ?>

Como van a ver en el archivo test.php, explico que pueden llamar variables de $_SESSION a traves del objeto SimpleSessionData... Por ahi les parece inutil, pero a mi siempre me parecio mas facil utilizar variables en forma de objeto, en vez de arreglos...

Asi que pueden hacer de las dos maneras:
Código PHP:
Ver original
  1. <?php
  2.  
  3. // Esto:
  4. $SimpleSession->data->foo = 'bar';
  5. print $SimpleSession->data->foo;
  6.  
  7. // Es igual a esto:
  8. $_SESSION['foo'] = 'bar';
  9. print $_SESSION['foo'] ;
  10.  
  11. // Otro ejemplo...
  12. if (isset($SimpleSession->data->foo)) {
  13.     print 'Existe foo';
  14.     unset($SimpleSession->data->foo);
  15. }
  16.  
  17.  
  18. ?>

Simplemente acuerdense de usar este metodo despues de $SimpleSession->start();

Bueno... Espero que les sirva y comenten... ¡Si ven que algo anda mal avisen! De seguro yo mismo tambien tratare de mejorarlo...

¡Saludos a todos!

Última edición por Nisrokh; 15/02/2010 a las 08:09