Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Nuevos Usuarios en Firebird (https://www.clubdelphi.com/foros/showthread.php?t=63590)

GustavoCruz 21-02-2009 01:42:16

Nuevos Usuarios en Firebird
 
Hola amigos del foro, actualmente estoy desarrollando una aplicación y me gustaría saber cómo puedo crear un usuario por código desde delphi y asignarle un rol, de ante mano muchas gracias por todos sus aportes.

Saludos.

Nasca 23-02-2009 11:11:13

Crear el usuario lo hago conectándome a la base de datos security.fdb y usando una sentencia como esta:

Código SQL [-]
insert into users (user_name, first_name, middle_name, last_name, passwd) values(:user_name, :first_name, :middle_name, :last_name, :password)

Hay que encriptar la password usando UnixCrypt:

Código Delphi [-]
function CreateFirebirdPassword(const password: String): String;
begin
    Result := Copy(UnixCrypt(password, '9z'),3,99);
    Result := Copy(UnixCrypt(Result, '9z'),3,99);
end;

Espero que te sirva.

GustavoCruz 23-02-2009 19:41:06

Hola Nasca, gracias por tu aporte, me funcionó perfectamente, ahora me gustarìa saber còmo le asigno un rol a usuario y de paso còmo hago la consulta que me muestre los roles que tiene una base de datos...


Gracias nuevamente por tu aporte Nasca.:)

Nasca 23-02-2009 20:11:34

Cita:

Empezado por GustavoCruz (Mensaje 339083)
Hola Nasca, gracias por tu aporte, me funcionó perfectamente, ahora me gustarìa saber còmo le asigno un rol a usuario y de paso còmo hago la consulta que me muestre los roles que tiene una base de datos...

Para asignar el rol investiga la sentencia GRANT, pero así por encima algo como esto:

sqldPermisos.CommandText := 'GRANT '+rol+' TO '+usuario;

Como ves también lo hago mediante ExecSQL()

Con respecto a la consulta:

Código SQL [-]
select (UP.RDB$USER) as USER_NAME,  (UP.RDB$RELATION_NAME) as ROL, rd.ROLE_DESCRIPCION 
from RDB$USER_PRIVILEGES UP left outer join RDB$RD rd on(UP.RDB$RELATION_NAME = rd.RDB$ROLE_NAME) 
where UP.RDB$PRIVILEGE = 'M' and UP.RDB$OBJECT_TYPE = 13 
order by UP.RDB$RELATION_NAME'

Espero que te sirva, yo tengo conectado el dataset de los roles al de los usuarios como un maestro-detalle y así puedo ir viendo los roles de cada usuario.

rretamar 24-02-2009 03:44:45

Muy buen aporte. Muy útil.

Saludos y gracias !!!!

GustavoCruz 27-02-2009 16:54:01

Hola nuevamente, aunque dije que me había funcionado, lo hice en una base de datos firebird 1.5, pero no me he podido conectar a security2.fdb en firebird 2.1, si aquí se hace de otro modo... te gradecería muchísimo que me no indicaras.

De ante mano muchas gracias...

Nasca 27-02-2009 21:52:59

Lo siento no lo he probado, mira la estructura de tablas por si cambia algún campo.

defcon1_es 02-03-2009 11:20:25

Hola.
Lo de conectarse directamente a la bd de seguridad de Firebird, sólo es válido para versiones 1.x, a partir de la version 2.0 esto ya no es posible.

Para dar de alta un usuario en Firebird 2.x, debes usar la herramienta gsec:
gsec.exe -USER SYSDBA -PASSWORD masterkey -add <nombre_usuario> -pw <Clave_usuario>

Para modificar un usuario:
gsec.exe -USER SYSDBA -PASSWORD masterkey -modify <nombre_usuario> -pw <Clave_usuario>

Para borrar un usuario:
gsec.exe -USER SYSDBA -PASSWORD masterkey -delete <nombre_usuario>

GustavoCruz 03-03-2009 20:36:58

Hola dfcon_1 te agradezco la información, pero no sé como ejecutar los parámetros, lo escribí como me mostrarte en tu post y me dio esto:

GSEC> user SYSDBA - PASSWORD masterkey - add gustavo - pw lucenys;
invalid switch specified
error in switch specifications
invalid switch specified in interactive mode
GSEC>
:(

me gustaría que me mostraras la forma de crear el nuevo usuario


Gustavo Cruz

defcon1_es 04-03-2009 12:09:32

Hola Gustavo, te lo puse para que lo ejecutaras desde la linea de comandos, pero desde delphi, yo hago esto:
Código Delphi [-]
ShellExecute_AndWait(
    PChar(ExtractFilePath(GetIBServerDataBase)+'bin\gsec.exe'),
    PChar('-USER SYSDBA -PASSWORD '+DatosSesion.Password+
    ' -modify '+Nombre+' -pw '+Clave),
    PChar(ExtractFilePath(GetIBServerDataBase)+'bin'));
// Con esta funcion, averigüo la ruta donde está el gsec.exe
// mirando en el registro de windows las distintas claves, según el motor y // version del mismo
Código Delphi [-]
function GetIBServerDataBase:string;
var Reg:TRegistry;
    FbsecuriyFile, FbsecuriyFile2, FbISC4: String;
begin
  Reg:=TRegistry.create;
  try
    Reg.Access:=KEY_READ;
    Reg.RootKey:=HKEY_LOCAL_MACHINE;
    if Not reg.OpenKey('SOFTWARE\Firebird Project\Firebird Server\Instances',false)
    then begin
      if Not reg.OpenKey('Software\FireBirdSQL\FireBird\CurrentVersion',false)
      then if Not reg.OpenKey('Software\Borland\InterBase\CurrentVersion',false)
           then if Not reg.OpenKey('Software\InterBase Corp\InterBase\CurrentVersion',false)
                then Raise Exception.Create('Interbase no está instalado en este equipo');
      FbsecuriyFile:=reg.ReadString('RootDirectory');
    end
    else begin
      FbsecuriyFile:=reg.ReadString('DefaultInstance');
    end;
    if Length(FbsecuriyFile)<=0
    then Raise Exception.create('Interbase no está instalado en este equipo');

    if FbsecuriyFile[length(FbsecuriyFile)]='\'
    then FbsecuriyFile:=Copy(FbsecuriyFile,1,Length(FbsecuriyFile)-1);
    FbISC4 := FbsecuriyFile + '\isc4.gdb';
    FbsecuriyFile2 := FbsecuriyFile + '\security2.fdb';
    FbsecuriyFile := FbsecuriyFile + '\security.fdb';
    if FileExists(FbsecuriyFile2)
    then Result := FbsecuriyFile2
    else if FileExists(FbsecuriyFile)
         then Result := FbsecuriyFile
         else if FileExists(FbISC4)
              then Result := FbISC4
              else Result := InputBox('No se encuentró la B.D. de USUARIOS de InterBase/FireBird.',
                                      'Teclee la ruta completa del fichero "security2.fdb", "security.fdb" o "isc4.gdb"',
                                      'C:\Archivos de programa\Firebird\FireBird_2_0\security2.fdb');
  finally
    Reg.free;
  end;
end;
// este procedimiento ejecuta un programa externo
Código Delphi [-]
procedure ShellExecute_AndWait(const FileName, Params, RutaDirectorio: string);
var
  exInfo: TShellExecuteInfo;
  Ph: DWORD;
begin
  FillChar(exInfo, SizeOf(exInfo), 0);
  with exInfo do
  begin
    cbSize       := SizeOf(exInfo);
    fMask        := SEE_MASK_NOCLOSEPROCESS or SEE_MASK_FLAG_DDEWAIT;
    Wnd          := GetActiveWindow();
    lpVerb       := 'open';
    lpParameters := PChar(Params);
    lpFile       := PChar(FileName);
    lpDirectory  := PChar(RutaDirectorio);
    nShow        := SW_HIDE; //SW_SHOWNORMAL;
  end;
  if ShellExecuteEx(@exInfo)
  then Ph := exInfo.HProcess
  else begin
    ShowMessage(SysErrorMessage(GetLastError));
    Exit;
  end;
  while WaitForSingleObject(ExInfo.hProcess, 50) <> WAIT_OBJECT_0 do
    Application.ProcessMessages;
  CloseHandle(Ph);
end;

GustavoCruz 06-03-2009 21:57:43

Hola defcon1_es, tu sabras disculpar mi torpeza pero resulta que aún no logro dar con el asunto...

No sé para qué utilizas la función GetIBServerDataBase?
y tampoco sé cuál es el programa externo que ejecutas y para qué lo haces?
en cuanto a la sentencia para dar de alta al nuevo usuario, es error que me mostraba al principio era por separar los guiones, lo hice sin separar y me mostró este resultado:

"invalid switch specified in interactive mode"

la línea la escribí así: "USER SYSDBA -PASSWORD masterkey -add gustavo -pw lucenys"

Gracias por tu ayuda que es sumamente valiosa

defcon1_es 08-03-2009 23:56:15

Cita:

Empezado por GustavoCruz (Mensaje 340454)
No sé para qué utilizas la función GetIBServerDataBase?

Para averiguar la ruta donde se instaló FireBird, porque FireBird lo puedes instalar en cualquier carpeta.
Cita:

Empezado por GustavoCruz (Mensaje 340454)
y tampoco sé cuál es el programa externo que ejecutas y para qué lo haces?

El programa externo es gsec.exe, y sirve para el mantenimiento de los usuarios de FireBird (altas, bajas y modificaciones)

Teclea esto desde la consola de comandos (tipo ms-dos), o desde el boton de Inicio de windows, opcion "Ejecutar":

C:\Archivos de programa\Firebird\Firebird_1_5\bin\gsec -USER SYSDBA -PASSWORD masterkey -add gustavo -pw lucenys

GustavoCruz 12-03-2009 19:42:19

Hola defcon1_es, ciertamente te agradezco mucho la ayuda que me haz prestado y la paciencia que haz tenido. He comprendido, sólo hasta hoy, tu código, y me ha funcionado perfectamente...

Gracias a ti y a todos los que enviaron sus aportes :):):):)

jconnor82 13-03-2009 14:31:46

Solo para agregar algo:

uso los componentes FIBPlus y este tiene uno TpFIBSecurityService paleta FIBPlusServices el cual se encarga de adminstrar usuarios.

las rutinas para crear, eliminar o modificar son estas:

Crear usuario:

Código Delphi [-]
    pFIBSecurityService1.Params.Values['user_name'] := 'sysdba';
    pFIBSecurityService1.Params.Values['password'] := 'masterkey';
  
    pFIBSecurityService1.Active := True;
    try
      pFIBSecurityService1.UserName := edUserName.Text;
   
      pFIBSecurityService1.Password := edPassword.Text;
       pFIBSecurityService1.FirstName := edFirstName.Text;
      pFIBSecurityService1.LastName := edLastName.Text;
      pFIBSecurityService1.GroupID := StrToInt(edGroupID.text); {No necesario}
      pFIBSecurityService1.AddUser;
    finally
      pFIBSecurityService1.Active := False;
    end;

Modificar usuario:

Código Delphi [-]
     pFIBSecurityService1.Params.Values['user_name'] := 'sysdba';
     pFIBSecurityService1.Params.Values['password'] := 'masterkey';
   
     pFIBSecurityService1.Active := True;
     try
       pFIBSecurityService1.UserName := edUserName.Text;
    
      pFIBSecurityService1.Password := edPassword.Text;
        pFIBSecurityService1.FirstName := edFirstName.Text;
       pFIBSecurityService1.LastName := edLastName.Text;
       pFIBSecurityService1.GroupID := StrToInt(edGroupID.text); {No necesario}
       pFIBSecurityService1.ModifyUser;
     finally
       pFIBSecurityService1.Active := False;
     end;

Borrar usuario:

Código Delphi [-]
     pFIBSecurityService1.Params.Values['user_name'] := 'sysdba';
      pFIBSecurityService1.Params.Values['password'] := 'masterkey';
    
      pFIBSecurityService1.Active := True;
      try
        pFIBSecurityService1.UserName := edUserName.Text;
   
        pFIBSecurityService1.DeleteUser;
      finally
        pFIBSecurityService1.Active := False;
      end;

Supongo y otros componentes libres como zeos tienen implementada esta funcion.

Como referencia te dejo el link Codigo Fuente


La franja horaria es GMT +2. Ahora son las 22:05:44.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi