Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Roles de usuario: No acabo de entender que hago mal

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Bases de Datos
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Roles de usuario: No acabo de entender que hago mal Responder citando

Primero pediros disculpas por la extensión de la consulta.

Estoy entrando en este campo, por otra parte nuevo para mi, dado que me hace falta para la aplicación que estoy desarrollando. Explico un poco lo que tengo hecho.

    1. Al crear la base de datos he creado dos roles:
      a. Maestro: Puede hacer todo en toda la base de datos.
      b. Usuario: Igual que el anterior, salvo que no puede tocar la tabla de usuarios de la aplicación

    Para ello ejecuto este código:
    Código:
    IBSql->Close();
    IBSql->SQL->Text = "CREATE ROLE Maestro";
    IBSql->Prepare();
    IBSql->ExecQuery();

    IBSql->Close();
    IBSql->SQL->Text = "CREATE ROLE Usuario";
    IBSql->Prepare();
    IBSql->ExecQuery();

    Con IBManager veo en la base de datos ambos roles definidos, y al crear tablas, vistas y procedimientos voy haciendo esto:
    Código:
    IBSql->Close();
    if (slIbSql->Strings[nItem].Pos("PROCEDURE") == 0)
    {
         IBSql->SQL->Text = "GRANT ALL ON " + cLeer + " TO  Maestro";
         if (cLeer != "USERS")
              IBSql->SQL->Text = fGestion->IBSql->SQL->Text + ", Usuario";
    }
    else
         IBSql->SQL->Text = "GRANT EXECUTE ON PROCEDURE " + cLeer + " TO Maestro, Usuario";
    IBSql->Prepare();
    IBSql->ExecQuery();

    slIbSql es un TStringList donde están cargados los CREATE TABLE..., CREATE VIEW..., etc., y voy comprobando que elemento voy creando. El código no me da error, se ejecuta bien todo y tal cual está al crearse cualquier tabla se ejecuta, por ejemplo:
    Código:
    GRANT ALL ON Personas TO Maestro, Usuario

    excepto en la tabla de usuarios que sería
    Código:
    GRANT ALL ON Personas TO Maestro

    2. Cuando creo los usuarios hago esto:
    Código:
    IBSql->Close();
    IBSql->SQL->Text = "GRANT [role] TO " + NombreUser;
    IBSql->Prepare();
    IBSql->ExecQuery();

    3. Al iniciar la aplicación y para verificar el nivel de autorización del usuario abro la base de datos así:
    Código:
    Transaction->Active = false;
    Database->Connected = false;
    Database->Params->Clear();
    Database->Params->Add("user_name=SYSDBA");
    Database->Params->Add("password=masterkey");
    Database->Connected = true;
    Transaction->Active = true;

    De esta manera no tengo problema para verificar autorizaciones, claves de acceso, etc. de quien entra. Una vez que lo he comprobado vuelvo a abrirla así:
    Código:
    Database->Connected = false;
    Database->Params->Clear();
    Database->Params->Add("user_name=" + NombreUser);
    Database->Params->Add("password=" + ClaveUser);
    Database->Params->Add("sql_role_name=[role]");
    Database->Connected = true;

    Donde [role] puede ser Maestro o Usuario. Puede que no sea el mejor sistema, pero no se me ha ocurrido otro.
    4. Cuando actualizo cualquier tabla no tengo ningún problema. Sin embargo, si trato de añadir cualquier registro a la tabla de usuarios me da siempre este error:
    Cita:
    no permission for insert/write access to TABLE USERS

    salvo que entre desde el prinicipio como sysdba.

Con esta consulta que encontré en Club Delphi:
Código:
SELECT Rdb$user, Rdb$grantor, Rdb$relation_name, Rdb$field_name, Rdb$user_type, Rdb$object_type FROM RDB$USER_PRIVILEGES GROUP BY Rdb$user, Rdb$grantor, Rdb$relation_name, Rdb$field_name, Rdb$user_type, Rdb$object_type ORDER BY Rdb$user

Saco por ejemplo esto:
    RDB$USER: ANGELITO
    RDB$GRANTOR: SYSDBA
    RDB$RELATION_NAME: MAESTRO
    RDB$FIELD_NAME: Null
    RDB$USER_TYPE: 8
    RDB$OBJECT_TYPE: 13

    RDB$USER: MAESTRO
    RDB$GRANTOR: SYSDBA
    RDB$RELATION_NAME: BAJAS
    RDB$FIELD_NAME: Null
    RDB$USER_TYPE: 13
    RDB$OBJECT_TYPE: 0

Y un registro por cada objeto de la base de datos, hasta 30; si RDB$RELATION_NAME es USUARIO (el otro rol creado) salen los mismos objetos que para MAESTRO excepto la tabla de usuarios. No acabo de ver que es lo que estoy haciendo mal. ¿Puede tener algo que ver con que al conceder privilegios a los usuarios falte algo?
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Hola Angel, viendo el código que estableces aqui, al parecer hay un detalle que no logro entender
Código:

IBSql->Close();
if (slIbSql->Strings[nItem].Pos("PROCEDURE") == 0)
{
     IBSql->SQL->Text = "GRANT ALL ON " + cLeer + " TO  Maestro";
     if (cLeer != "USERS")
          IBSql->SQL->Text = fGestion->IBSql->SQL->Text + ", Usuario";
}
else
     IBSql->SQL->Text = "GRANT EXECUTE ON PROCEDURE " + cLeer + " TO Maestro, Usuario";
IBSql->Prepare();
IBSql->ExecQuery();


cLeer: <-- es la Tabla a la cual te refieres.
pero la siguiente linea no logro entender que es lo que quieres realizar
Angel escribió:
if (cLeer != "USERS")
IBSql->SQL->Text = fGestion->IBSql->SQL->Text + ", Usuario";


Al usar la opcion "GRANT ALL ON <Nombre_Tabla> TO <Nombre_Rol>"
Estas estableciendo los privilegios SELECT, UPDATE, INSERT, DELETE, al usuario en este caso "Maestro", quien se supone debe tener los privilegios al igual que SYSDBA.

Pero lo unico que veo es que estas estableciendo los privilegios "GRANT EXECUTE ON PROCEDURE" a Maestro y Usuario.

En relativa, estas estableciendo los privilegios para ejecutar un procedimiento que puede afectar a la tabla usuarios, pero no les estas otorgando privilegios para modificar la tabla.

Algo como si le dijeras al servidor: Ejecuta el procedimiento para aumentar el ID de usuario, pero NO MODIFIQUES LA TABLA de usuarios.

Puede que al verificar el contenido de tu TStringList slIbSql, te descuenta que denegas el uso de la tabla usuarios, pero le accedes a usar procedimientos que afectan a la tabla.

Espero no enredarte mas pero es sencillo de notar.

"Toma la llave del ferrari y llevalo al parque, PERO NO HABRAS LA PUERTA PARA ENTRAR"

Entonces como es posible que me des permiso de executar un procedimiento en una tabla a la cual no tengo derecho de usar.

algo asi te esta diciendo El Servidor de Firebird.


De paso en este enlace viene un ejemplo relativamente sencillo de lo que estas realizando.
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

César C. Salazar González escribió:
pero la siguiente linea no logro entender que es lo que quieres realizar
Angel escribió:
IBSql->SQL->Text = "GRANT ALL ON " + cLeer + " TO Maestro";
if (cLeer != "USERS")
IBSql->SQL->Text = fGestion->IBSql->SQL->Text + ", Usuario";

Efectivamente cLeer es el nombre de la tabla; no me di cuenta de explicarlo. Lo que hago tal vez es un poco enrevesado: Tengo en la base de datos una tabla USERS con los usuarios que pueden usar la aplicación, al margen de la del propio sistema; lo que pretendo con esas tres líneas es darle privilegios en esa tabla sólo al rol maestro.
César C. Salazar González escribió:
En relativa, estas estableciendo los privilegios para ejecutar un procedimiento que puede afectar a la tabla usuarios, pero no les estas otorgando privilegios para modificar la tabla.

Esto no se me había ocurrido; tengo que revisarlo. Muchas gracias César.
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

[quote="Angel"]
César C. Salazar González escribió:
pero la siguiente linea no logro entender que es lo que quieres realizar
Angel escribió:
IBSql->SQL->Text = "GRANT ALL ON " + cLeer + " TO Maestro";
if (cLeer != "USERS")
IBSql->SQL->Text = fGestion->IBSql->SQL->Text + ", Usuario";

Ya sé que está pasando; lo he descubierto hoy por pura chiripa. Embarassed Resulta que al comprobar si existían las tablas, que hacía con SYSDBA/masterkey, iba dando los permisos a cada tabla; luego pedía el usuario y la clave del operador, cerraba la base de datos y la volvía a abrir con los nuevos datos. Claro: Al cerrarla se perdían TODOS los permisos que había ido dando. ¡Seré bruto!
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.