Utilizamos cookies propias y de terceros. [Más información sobre las cookies].
Política de cookies
Proyecto AjpdSoft

· Inicio
· Buscar
· Contactar
· Cookies
· Descargas
· Foros
· Historia
· Nosotros
· Temas
· Top 10
· Trucos
· Tutoriales
· Wiki
Proyecto AjpdSoft: Foros

AjpdSoft :: Ver tema - Ayuda en la creacion de Formulario de login para MySql
Foros de discusión Buscar Perfil FAQ Iniciar sesión
Information Ayuda en la creacion de Formulario de login para MySql

Publicar nuevo tema Responder al tema
Foros de discusión » Borland Delphi, Codegear Delphi .Net   
Ver tema anterior :: Ver tema siguiente
AutorMensaje
agustinbus
Excelente usuario


Registrado: Apr 17, 2009
Mensajes: 38

Asunto: Ayuda en la creacion de Formulario de login para MySql Responder citando

Hola a todos. Mi pregunta y gran duda es la siguiente:
Estoy haciendo una aplicacion en la cual existen varios usuarios, algunos con privilegios de realizar consultas e insertar registros, y otros solo con privilegios de realizar consultas. Los privilegios ya los asigne a los diferentes usuarios.
Mi problema es como debo hacer para conectarme a la BBDD creada mediante delphi, pero al inicio mostrar un formulario de logueo, y de acuerdo al usuario, conectarse.
Utilizo ADOQuerys, DataSources, DBGrids, Mediante el puente ODBC.
Desde ya muchas gracias.
MensajePublicado:
Mie Sep 16, 2009 2:10 am
Top of PageVer perfil de usuario
agustinbus
Excelente usuario


Registrado: Apr 17, 2009
Mensajes: 38

Asunto: Responder citando

Nadie sabe????
MensajePublicado:
Vie Sep 18, 2009 5:12 pm
Top of PageVer perfil de usuario
alonsojpd
Administrador/Moderador


Registrado: Sep 16, 2003
Mensajes: 2687

Asunto: Responder citando

agustinbus escribió:
Nadie sabe????


Danos unos días, estamos preparándote, desde el departamento de desarrollo, un formulario de login "modelo", que tal vez te sirva.
MensajePublicado:
Dom Sep 20, 2009 10:39 am
Top of PageVer perfil de usuario
alonsojpd
Administrador/Moderador


Registrado: Sep 16, 2003
Mensajes: 2687

Asunto: Re: Ayuda en la creacion de Formulario de login para MySql Responder citando



Anuncios



agustinbus escribió:
Hola a todos. Mi pregunta y gran duda es la siguiente:
Estoy haciendo una aplicacion en la cual existen varios usuarios, algunos con privilegios de realizar consultas e insertar registros, y otros solo con privilegios de realizar consultas. Los privilegios ya los asigne a los diferentes usuarios.
Mi problema es como debo hacer para conectarme a la BBDD creada mediante delphi, pero al inicio mostrar un formulario de logueo, y de acuerdo al usuario, conectarse.
Utilizo ADOQuerys, DataSources, DBGrids, Mediante el puente ODBC.
Desde ya muchas gracias.


Aquí te ponemos el código para el formulario de Login:

Código:

unit UnidadLogin;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, jpeg, ExtCtrls, DB, shellapi, ADODB, inifiles, aes, base64;

type
  TformLogin = class(TForm)
    conexionADO: TADOConnection;
    Image1: TImage;
    GroupBox1: TGroupBox;
    Label1: TLabel;
    Label2: TLabel;
    txtUsuario: TEdit;
    txtContrasena: TEdit;
    bIniciar: TBitBtn;
    bOpciones: TBitBtn;
    bCancelar: TBitBtn;
    GroupBox2: TGroupBox;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    txtBDServidor: TEdit;
    txtBDPuerto: TEdit;
    txtBDBD: TEdit;
    txtProveedor: TEdit;
    Label3: TLabel;
    txtDriver: TEdit;
    Label4: TLabel;
    opRecordarContrasena: TCheckBox;
    procedure bCancelarClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure bIniciarClick(Sender: TObject);
    procedure bOpcionesClick(Sender: TObject);
    procedure Image1Click(Sender: TObject);
  private
    { Private declarations }

  public
    { Public declarations }
  end;

var
  formLogin: TformLogin;

const
   //para encriptación de contraseñas en AES
   claveEncriptacionTexto = '5f3ddfJ*nt2Ñv7Wp';

implementation

{$R *.dfm}

//encriptar datos
function encriptar (Str, Clave : String) : String;
var
  Src: TStringStream;
  Dst: TMemoryStream;
  Size: Integer;
  Key: TAESKey;
  ExpandedKey: TAESExpandedKey;
begin
  Result:= EmptyStr;
  Src:= TStringStream.Create(Str);
  try
    Dst:= TMemoryStream.Create;
    try
      // Preparamos la clave, lo ideal es que tenga 32 caracteres
      FillChar(Key,Sizeof(Key),#0);
      if Length(Clave) > Sizeof(Key) then
        move(PChar(Clave)^,Key,Sizeof(key))
      else
        move(PChar(Clave)^,Key,Length(Clave));
      AEsExpandKey(ExpandedKey,Key);
      // Guardamos el tamaño del texto original
      Size:= Src.Size;
      Dst.WriteBuffer(Size,Sizeof(Size));
      // Ciframos el texto
      AESEncryptStreamECB(Src,Dst,ExpandedKey);
      // Lo codificamos a base64
      Result:= BinToStr(Dst.Memory,Dst.Size);
    finally
      Dst.Free;
    end;
  finally
    Src.Free;
  end;
end;

//desencriptar datos
function desencriptar (Str, Clave : String): String;
var
  Src: TMemoryStream;
  Dst: TStringStream;
  Size: Integer;
  Key: TAESKey;
  ExpandedKey: TAESExpandedKey;
begin
  Result:= EmptyStr;
  Src:= TMemoryStream.Create;
  try
    Dst:= TStringStream.Create(Str);
    try
      StrToStream(Str, Src);
      Src.Position:= 0;
      FillChar(Key,Sizeof(Key),#0);
      if Length(Clave) > Sizeof(Key) then
        move(PChar(Clave)^,Key,Sizeof(key))
      else
        move(PChar(Clave)^,Key,Length(Clave));
      AESExpandKey(ExpandedKey,Key);
      // Leemos el tamaño del texto
      try
        Src.ReadBuffer(Size,Sizeof(Size));
        AESDecryptStreamECB(Src,Dst,ExpandedKey);
        Dst.Size:= Size;
        Result:= Dst.DataString;
      except
        Result := '';
      end;
    finally
      Dst.Free;
    end;
  finally
    Src.Free;
  end;
end;

//lee un valor booleano de un fichero INI
function leBoolINI (clave, cadena : string;
    defecto : boolean) : boolean;
begin
  with tinifile.create (changefileext(paramstr(0),'.INI')) do
  try
    result := readbool (clave, cadena, defecto);
  finally
    free;
  end;
end;

//lee un valor numérico de un fichero INI
function leNumINI (clave, cadena : string;
    defecto : Integer) : Integer;
begin
  with tinifile.create (changefileext(paramstr(0),'.INI')) do
  try
    result := ReadInteger (clave, cadena, defecto);
  finally
    free;
  end;
end;

//lee un valor string de un fichero INI
function leCadINI (clave, cadena : string;
    defecto : String) : String;
begin
  with tinifile.create (changefileext(paramstr(0),'.INI')) do
  try
    result := ReadString (clave, cadena, defecto);
  finally
    free;
  end;
end;

//escribe un valor string en un fichero INI
procedure esCadINI (clave, cadena : string; valor : String);
begin
  with tinifile.create (changefileext(paramstr(0),'.INI')) do
  try
    WriteString (clave, cadena, valor);
  finally
    free;
  end;
end;

//escribe un valor boolean en un fichero INI
procedure esBoolINI (clave, cadena : string; valor : Boolean);
begin
  with tinifile.create (changefileext(paramstr(0),'.INI')) do
  try
    WriteBool (clave, cadena, valor);
  finally
    free;
  end;
end;

//escribe un valor numérico en un fichero INI
procedure esNumINI (clave, cadena : string; valor : Integer);
begin
  with tinifile.create (changefileext(paramstr(0),'.INI')) do
  try
    WriteInteger (clave, cadena, valor);
  finally
    free;
  end;
end;

procedure TformLogin.bCancelarClick(Sender: TObject);
begin
  close;
end;

procedure TformLogin.FormCreate(Sender: TObject);
begin
  Height := 193;

  opRecordarContrasena.Checked :=
      leBoolINI('Base de datos', 'Tipo BD MySQL', false);
  txtUsuario.Text :=
      leCadINI('Base de datos', 'Tipo BD MySQL - Usuario', '');
  if opRecordarContrasena.Checked then
    txtContrasena.Text :=
        desencriptar (leCadINI('Base de datos', 'Tipo BD MySQL - Contraseña', ''),
        claveEncriptacionTexto);
  txtBDServidor.Text := leCadINI('Base de datos', 'Tipo BD MySQL - Servidor', '');
  txtBDPuerto.Text := leCadINI('Base de datos', 'Tipo BD MySQL - Puerto', '3306');
  txtBDBD.Text := leCadINI('Base de datos', 'Tipo BD MySQL - Nombre BD', '');
  txtProveedor.Text :=
      leCadINI('Base de datos', 'Tipo BD MySQL - Proveedor', 'MSDASQL.1');
  txtDriver.Text :=
      leCadINI('Base de datos', 'Tipo BD MySQL - Driver ODBC',
          'MySQL ODBC 5.1 Driver');
end;

procedure TformLogin.bIniciarClick(Sender: TObject);
var
  versionBD : string;
  valorParametro1, valorParametro2 : string;
  accesoSiDistinta : string;
begin
  if (txtUsuario.Text = '') or (txtBDServidor.Text = '') or
      (txtBDBD.Text = '') then
  begin
    MessageDlg('Falta datos por introducir para poder iniciar la sesión.',
        mtWarning, [mbok], 0);
    txtUsuario.SetFocus;
  end
  else
  begin
    esCadINI('Base de datos', 'Tipo BD MySQL - Usuario', txtUsuario.Text);
    if opRecordarContrasena.Checked then
      esCadINI('Base de datos', 'Tipo BD MySQL - Contraseña',
          trim(encriptar (txtContrasena.Text, claveEncriptacionTexto)));
    esCadINI('Base de datos', 'Tipo BD MySQL - Servidor', txtBDServidor.Text);
    esCadINI('Base de datos', 'Tipo BD MySQL - Puerto', txtBDPuerto.Text);
    esCadINI('Base de datos', 'Tipo BD MySQL - Nombre BD', txtBDBD.Text);
    esBoolINI('Base de datos', 'Tipo BD MySQL', opRecordarContrasena.Checked);

    conexionADO.Close;
    conexionADO.Provider := txtProveedor.text;
    conexionADO.ConnectionString :=
          'Provider=' + txtProveedor.text + ';' +
          'Persist Security Info=True;' +
          'Extended Properties="DRIVER={' + txtDriver.Text + '};DESC=;' +
          'DATABASE=' + txtBDBD.Text + ';' +
          'SERVER=' + txtBDServidor.text + ';' +
          'UID=' + txtUsuario.Text + ';' +
          'PASSWORD=' + txtContrasena.Text + ';' +
          'PORT=' + txtBDPuerto.text + ';' +
          'OPTION=131072;STMT=;"';
    try
      conexionADO.Connected := true;

      // Aquí irá el código de carga del formulario principal
      // de la aplicación, puesto que ha pasado el proceso de
      // inicio de sesión (usuario y contraseña válidos)
      MessageDlg('Conectado al servidor MySQL mediante ADO.',
          mtInformation, [mbok], 0);

    except
      on e : exception do
      begin
        MessageDlg ('No se ha podido conectar con el servidor: [' +
            txtBDServidor.Text +
            ']. Compruebe que el servicio de MySQL está iniciado y que ha ' +
            'escrito correctamente el nombre/ip del servidor.' +
            chr(13) + chr(13) +
            'A continuación la descripción completa del error:' + chr(13) +
            e.ClassName + chr(13) + e.Message,
            mtError, [mbok], 0);
        Exit;
      end;
    end;
  end;
end;

procedure TformLogin.bOpcionesClick(Sender: TObject);
begin
  if Height = 340 then
  begin
    Height := 193;
    bOpciones.Caption := 'Opciones >>';
  end
  else
  begin
    Height := 340;
    bOpciones.Caption := 'Opciones <<';
  end;
end;

procedure TformLogin.Image1Click(Sender: TObject);
begin
  ShellExecute(Handle, Nil, PChar('http://www.ajpdsoft.com'),
      Nil, Nil, SW_SHOWNORMAL);
end;

end.


Este código incluye varias opciones:

* Permite modificar las opciones de conexión como: IP del servidor de MySQL, nombre de la base de datos, driver ODBC, proveedor, etc.
* Permite guardar la contraseña del usuario encriptada.
* El usuario puede cambiar los valores de acceso pulsando un botón.
* Las opciones se guardan en un fichero .INI, con esta estructura:

[Base de datos]
Tipo BD MySQL - Usuario=root
Tipo BD MySQL - Contraseña=
Tipo BD MySQL - Servidor=ajpdsoft
Tipo BD MySQL - Puerto=3306
Tipo BD MySQL - Nombre BD=bdajpdsoft
Tipo BD MySQL=0


En el formulario necesitarás los siguientes componentes:



Lógicamente, lo recomendable es que pongas el ADOConnection en un DataModule y los ADOTable y ADOQuery los conectes a este ADOConnection mediante la propiedad "Connection". De esta forma, al abrir el ADOConnection con un usuario y contraseña, todo lo que ejecute se realizará con los permisos que este usuario tenga en MySQL.
MensajePublicado:
Dom Sep 20, 2009 11:26 am
Top of PageVer perfil de usuario
alonsojpd
Administrador/Moderador


Registrado: Sep 16, 2003
Mensajes: 2687

Asunto: Re: Ayuda en la creacion de Formulario de login para MySql Responder citando



Anuncios



Aquí tienes la descarga del formulario de login con ADO y MySQL:

http://www.ajpdsoft.com/modules.php?name=Downloads&d_op=viewdownloaddetails&lid=247

Y aquí tienes otra aplicación gratuita de esta web que utiliza ADO para conexión con Oracle o MySQL utilizando ADO y con personalización del usuario que se utilizará: AjpdSoft Administracion PHP-Nuke - Código fuente Delphi 6

http://www.ajpdsoft.com/modules.php?name=Downloads&d_op=viewdownloaddetails&lid=196
MensajePublicado:
Dom Sep 20, 2009 12:08 pm
Top of PageVer perfil de usuario
agustinbus
Excelente usuario


Registrado: Apr 17, 2009
Mensajes: 38

Asunto: Responder citando

MUUUUUUUUUCHHHHHHIIIISIIIIIMMMASSSSS GRACIIIIASSSS!!!!
Sos un idolooo!!! Te doy un 11 de puntaje como respuesta!!! Otra vez gracias por tu tiempo en responder una pregunta con tal predisposicion!!!
Nunca use AdoConnection. Voy a probar. GRACIAS!!!
MensajePublicado:
Lun Sep 21, 2009 5:35 pm
Top of PageVer perfil de usuario
alonsojpd
Administrador/Moderador


Registrado: Sep 16, 2003
Mensajes: 2687

Asunto: Responder citando

En el siguiente enlace puedes ver un artículo que explica cómo hacer un formulario de login con Delphi y MySQL, también incluye opción de autenticación en servidor LDAP:

http://www.ajpdsoft.com/modules.php?name=News&file=article&sid=518
MensajePublicado:
Lun Feb 21, 2011 2:41 pm
Top of PageVer perfil de usuario
Mostrar mensajes de anteriores:   
Todas las horas son GMT - 1 Horas
Publicar nuevo tema Responder al tema
Foros de discusión » Borland Delphi, Codegear Delphi .Net  

Cambiar a:  
Key
  Puede publicar nuevos temas en este foro
No puede responder a temas en este foro
No puede editar sus mensajes en este foro
No puede borrar sus mensajes en este foro
No puede votar en encuestas en este foro
Visita nuestro nuevo sitio web con programas y contenidos actualizados: Proyecto A