Ir al contenido



Foto

Creando un módulo de autenticación de usuarios - Parte 1


  • Por favor identifícate para responder
2 respuestas en este tema

#1 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.408 mensajes
  • LocationRepública Dominicana

Escrito 10 septiembre 2016 - 11:45

En esta serie de tutoriales vamos aprender a realizar un sistema de autenticación (Login) con Delphi (RAD Studio XE7) y Firebird (Versión 2.5), aunque en la red existen infinidad de tutoriales la gran mayoría se limitan en crear el formulario de acceso (El típico 2 TEdits y un TButton) y no encontraba algo más allá que eso, en mi tutorial aprenderemos además de crear la típica ventana de Login también la creación de los permisos de cada usuario y su respectivos bloqueos/desbloqueos, ¡Empecemos!.
 
Base de Datos:
 
Primero que todo recordar que este tutorial se basa en el motor de base de datos Firebird 2.5 (Aunque se puede aplicar sin problemas en otros motores y versiones), continuamos, debemos crear la tabla donde crearemos los usuarios y sus respectivos permisos, ésta es su estructura: 

sql
  1. CREATE GENERATOR GEN_USUARIOS_ID;
  2.  
  3. CREATE TABLE USUARIOS (
  4. USER_ID INTEGER NOT NULL,
  5. USER_ALIAS VARCHAR(10) NOT NULL,
  6. USER_NOMBRE VARCHAR(50) NOT NULL,
  7. USER_PASS VARCHAR(50) NOT NULL,
  8. USER_STATE SMALLINT,
  9. USER_CREADO DATE,
  10. USER_MODULOS BLOB SUB_TYPE 1 SEGMENT SIZE 4096 CHARACTER SET ISO8859_1
  11. );
  12.  
  13. ALTER TABLE USUARIOS ADD CONSTRAINT PK_USUARIOS PRIMARY KEY (USER_ID);
  14.  
  15. CREATE OR ALTER TRIGGER USUARIOS_BI FOR USUARIOS
  16. ACTIVE BEFORE INSERT POSITION 0
  17. AS
  18. BEGIN
  19. IF (NEW.user_id IS NULL) THEN
  20. NEW.user_id = gen_id(gen_usuarios_id,1);
  21. END

Explico:

USER_ID – El código del usuario.
USER_ALIAS  - Es el alias del usuario, esas que utilizas en los foros, correos, etc.
USER_NOMBRE  - El nombre completo del Usuario.
USER_PASS – La contraseña del Usuario.
USER_STATE – El estado del usuario (Activo, Bloqueado).
USER_CREADO – La fecha en que se creó ese Usuario.
USER_MODULOS – Aquí se guardarán los permisos de los usuarios, o sea, qué módulos tiene accesos o no.

Espero se haya entendido todo, si es así, continuamos.

Ahora crearemos la clase TUser donde estarán contenidas todas sus propiedades y funciones:

delphi
  1. type
  2. TUser = class
  3. UID: Integer;
  4. UAlias: String;
  5. UNombre: String;
  6. UClave: String;
  7. UState: Integer;
  8. UPermisos: TStrings;
  9. end;

No creo que lo anterior requiera de explicación ya que se sobre-entiende, si no es así háganmelo saber. Antes debemos crear primero la ventana de login para continuar con las funciones y procedimientos para su funcionamiento, necesitaremos lo siguiente:
  • 2 TLabels
  • 2 TEdits
  • 1 TButton.
En mi caso mi ventana quedaría de ésta manera (Pero el diseño queda de ustedes el gusto y preferencia):

uc?export=view&id=0By7JuEAKW5QmS3d3TlRTY


Ya que tenemos la ventana de acceso (Login) procedemos a crear algunas funciones.

Login:

La función login se encargará de determinar si los datos de acceso proporcionado por el usuario son correcto o no y así dar paso al sistema, hacemos la declaración en la clase TUser:

delphi
  1. type
  2. TUser = class
  3. UID: Integer;
  4. UAlias: String;
  5. UNombre: String;
  6. UClave: String;
  7. UState: Integer;
  8. UPermisos: TStrings;
  9. function login(user: String; clave: String): Boolean;
  10. end;

y el código es el siguiente:

delphi
  1. function TUser.login(user: string; clave: string): Boolean;
  2. var Login: TFDQuery; //Componentes FireDAC, puedes hacer uso de otros.
  3. begin
  4.  
  5. Login := TFDQuery.Create(nil);
  6.  
  7. Login.Connection := Datos.dbDatos; //Datos es el DataModule y dbDatos es un TFDConnection
  8.  
  9. //Primero verificamos si existe el usuario (Alias)
  10. Login.SQL.Text := 'SELECT USER_ID, USER_ALIAS, USER_NOMBRE, USER_PASS, USER_STATE FROM USUARIOS WHERE USER_ALIAS = :ALIAS';
  11.  
  12. Login.ParamByName('ALIAS').AsString := User;
  13.  
  14. try
  15. Login.Open;
  16. Except
  17. On E:EFDDBEngineException do
  18. begin
  19. MessageDLG(E.Message,mtError,[mbOk],0);
  20. Abort;
  21. end;
  22. end;
  23.  
  24. //Si existe el usuario comparamos la clave/contraseña
  25. if not Login.IsEmpty then begin
  26. if (Login.FieldByName('USER_STATE').AsInteger = 1) then begin
  27. if (Login.FieldByName('USER_PASS').AsString = Clave) then
  28. begin
  29. Result := True; //Devolvemos verdadero si concuerda
  30.  
  31. //Cargamos algunos datos del usuario
  32. UID := Login.FieldByName('USER_ID').AsInteger;
  33. UAlias := Login.FieldByName('USER_ALIAS').AsString;
  34. UNombre := Login.FieldByName('USER_NOMBRE').AsString;
  35. end else begin
  36.  
  37. Result := False; //Devolvemos Falso si no concuerda
  38.  
  39. MessageDLG('¡La contraseña no es correcta!, intentelo de nuevo.',mtError,[mbOk],0);
  40.  
  41. end;
  42. end else begin
  43.  
  44. Result := False; // Devolvemos Falso si no existe el usuario
  45.  
  46. MessageDLG('¡Usuario incorrecto!',mtError,[mbOk],0);
  47.  
  48. end;
  49. end else begin
  50.  
  51. Result := False; //Devolvemos Falso si el usuario está suspendido por el administrador
  52.  
  53. MessageDLG('Este usuario está suspendido. Por Favor contacte con el administrador',mtWarning,[mbOk],0);
  54.  
  55. end;
  56.  
  57. Login.Free; //Liberamos la consulta
  58.  
  59. end;

Volvemos a la ventana del Login, doble click al botón y colocamos el siguiente código:

delphi
  1. procedure TFLogin.Button1Click(Sender: TObject);
  2. var User: TUser;
  3. begin
  4.  
  5. User := TUser.Create;
  6.  
  7. //Hacemos el Login
  8. if User.login(edAlias.Text,edClave.Text) then
  9. Close; //Si los datos son verdaderos cerramos la ventana de login
  10.  
  11. User.Free;
  12.  
  13. end;

Ahora veremos como cargar la ventana de login antes de acceder al sistema y hacer la prueba de acceso, haremos que los formularios se auto-creen al inicio del sistema excepto el de Login, o sea,  Project->Options->Forms->Auto-Create forms, aquí colocamos el DataModule si existe y el formulario principal, en Available Forms colocamos el formulario Login (En este caso lo llamé FLogin), en el evento OnShow del formulario principal (En este Caso lo llamé FPrincipal), colocamos lo siguiente:

delphi
  1. procedure TFPrincipal.FormShow(Sender: TObject);
  2. begin
  3. //Mostramos la pantalla de inicio
  4. FLogin := TFLogin.Create(Self);
  5. try
  6. FLogin.ShowModal;
  7. finally
  8. Flogin.Free;
  9. end;
  10. end;

Ejecutamos la aplicación y nos debe de salir la ventana de acceso, si no es así, algún paso debes haber saltado, revise de nuevo e inténtelo otra vez, caso contrario, introducimos los datos de usuario y ya debemos accesar al formulario principal, (Recuerden que debe haber un usuario creado en la BD para que funcione).
Eso es todo en esta primera parte, en la próxima veremos cómo crear los usuarios y sus respectivos permisos.

Espero lo disfruten.
  • 3

#2 BDWONG

BDWONG

    Member

  • Miembros
  • PipPip
  • 28 mensajes

Escrito 10 septiembre 2016 - 07:21

Gracias por el tuto ya le di una mirada voy a probarlo en mysql que no uso firebird.

Saludos... (b)


  • 0

#3 ELKurgan

ELKurgan

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 546 mensajes
  • LocationEspaña

Escrito 11 septiembre 2016 - 11:07

Gracias por el aporte

 

Saludos


  • 0