 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Jue 01 Oct, 2009 5:30 pm Asunto: Roles de usuario: No acabo de entender que hago mal |
|
|
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 |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Sab 03 Oct, 2009 4:55 am Asunto: |
|
|
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. _________________
 |
|
| Volver arriba |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Sab 03 Oct, 2009 11:24 am Asunto: |
|
|
| 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 |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Vie 09 Oct, 2009 1:35 pm Asunto: |
|
|
[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. 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 |
|
 |
|
|
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
|
© 2002–2026 Club Builder · Funciona con phpBB.
|