Ir al contenido


Foto

Listar y asignar Roles


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

#1 santiago14

santiago14

    Advanced Member

  • Miembros
  • PipPipPip
  • 334 mensajes
  • LocationCerrillos - Salta - Argentina

Escrito 02 junio 2017 - 02:05

Buenas, estoy tratando de Listar los Roles que tengo en una BBDD.
También quiero poder tener una lista de usuarios y asociarlos con los roles que yo quiera.

Estoy usando FireDAC y Delphi XE5.
La idea es bastante simple:un formulario, dos grillas (Usuarios y Roles), seleccionar un registro de cada lado y con un click hacer la asociación. Al final, me tendría que decir con un cartelito que lo hice de manera exitosa.

Estoy usando TFDIBSecurity de FireDAC para las operaciones con los usuarios. Ya he logrado listarlos, agregarlos, modificarlos y eliminarlos. No puedo hacer lo mismo con los Roles de mi BBDD.

¿Cómo se hace esto? ¿Necesito otro componente de FireDAC o es con ese mismo?

Bueno, espero haber sido claro.

Gracias.

 


  • 0

#2 santiago14

santiago14

    Advanced Member

  • Miembros
  • PipPipPip
  • 334 mensajes
  • LocationCerrillos - Salta - Argentina

Escrito 02 junio 2017 - 04:14

Perdón. La BBDD es Firebird 2.5


Enviado desde mi iPhone utilizando Tapatalk
  • 0

#3 santiago14

santiago14

    Advanced Member

  • Miembros
  • PipPipPip
  • 334 mensajes
  • LocationCerrillos - Salta - Argentina

Escrito 07 junio 2017 - 07:30

Bueno, después de luchar y luchar contra la corriente logré hacerlo.
Una ventana donde puedo dar de alta, baja y modificar los datos del Usuario. Desde Delphi.
Otra ventana donde puedo asignar los Roles a esos Usuarios, y quitarlos si es necesario.

Pongo a disposición el código, y unas imágenes que grafican lo que digo.


delphi
  1. //Los procedures necesarios para hacer las cosas
  2. procedure Roles(qryRoles:TFDQuery);
  3. begin
  4. with qryRoles do
  5. begin
  6. Close;
  7. sql.Clear;
  8. sql.Add('Select r.rdb$role_name ');
  9. sql.Add('From rdb$roles r');
  10. try
  11. Open();
  12. except
  13. raise;
  14. end;
  15. end;
  16. end;
  17.  
  18. procedure UsuariosxRoles(qryUsuariosxRoles:TFDQuery);
  19. begin
  20. with qryUsuariosxRoles do
  21. begin
  22. close;
  23. sql.clear;
  24. sql.add('Select r.rdb$user, r.RDB$RELATION_NAME as grupos ');
  25. sql.Add('From RDB$USER_PRIVILEGES r ');
  26. sql.Add('Where r.RDB$PRIVILEGE = ''M'' ');
  27. sql.Add('Order by 1 asc, 2 asc ');
  28. try
  29. //messagedlg(consulta.sql.text,mtinformation,[mbok],0);
  30. Open;
  31. except
  32. raise;
  33. end; //del try
  34. end; //del with
  35. end;
  36.  
  37. procedure PermitirRol(usuario:string; rol:string; grantOption:boolean;
  38. qRoles:TFDQuery);
  39. {Para usuarios de cualquier grupo, si es altagerencia tiene el admin option}
  40. var
  41. sentencia:string;
  42. begin
  43. sentencia := 'Grant ' + rol + ' to ' + usuario;
  44. if grantOption then
  45. sentencia := sentencia + ' with admin option';
  46. with qRoles do
  47. begin
  48. close;
  49. sql.Clear;
  50. sql.add(sentencia);
  51. try
  52. ExecSQL;
  53. except
  54. raise;
  55. end;
  56. end; //del with
  57. end;
  58.  
  59. procedure QuitarRol(usuario:string; rol:string; qRoles:TFDQuery);
  60. var
  61. sentencia:string;
  62. begin
  63. sentencia := 'Revoke ' + rol + ' from ' + usuario;
  64. with qRoles do
  65. begin
  66. close;
  67. sql.Clear;
  68. sql.add(sentencia);
  69. try
  70. ExecSQL;
  71. except
  72. raise;
  73. end;
  74. end; //del with
  75. end;
  76.  
  77.  
  78. //El Form de Roles x Usuarios
  79. procedure TfrmRolesxUsuarios.btnGrantedClick(Sender: TObject);
  80. var
  81. NombreUsuario, NombreRol:string;
  82. begin
  83. if (memUsuarios.RecNo > 0) and (grdRoles.SelectedRow >= 0)
  84. and (IDYES = Application.MessageBox('¿Confirma nueva Relación?.',
  85. PWideChar(Self.Caption), MB_YESNO + MB_ICONQUESTION + MB_DEFBUTTON2)) then
  86. begin
  87. NombreUsuario:=memUsuarios.FieldByName('UserName').AsString;
  88. NombreRol:=grdRoles.CellByName['clRoles', grdRoles.SelectedRow].AsString;
  89. with DataModule1 do
  90. begin
  91. terminarTransaccion;
  92. transaccion.StartTransaction;
  93. try
  94. PermitirRol(NombreUsuario, NombreRol, False, qRoles);
  95. //Los usuarios x roles
  96. UsuariosxRoles(qRoles);
  97. transaccion.CommitRetaining;
  98. LimpiarNextGrid(grdUsuariosxRoles);
  99. CargarNextGrid(grdUsuariosxRoles, qRoles);
  100. transaccion.Commit;
  101. except
  102. on e:Exception do
  103. begin
  104. terminarTransaccion;
  105. mErrores(e, 'Operación solicitada falló...', self.Caption);
  106. end;
  107. end;
  108. end;
  109. end
  110. else
  111. begin
  112. Application.MessageBox('Debe seleccionar un Usuario y un Rol',
  113. PWideChar(self.Caption), MB_OK + MB_ICONERROR);
  114. end;
  115. end;
  116.  
  117. procedure TfrmRolesxUsuarios.btnRevokeClick(Sender: TObject);
  118. var
  119. NombreUsuario, NombreRol:string;
  120. begin
  121. if (grdUsuariosxRoles.SelectedRow >= 0)
  122. and (IDYES = Application.MessageBox('¿Confirma eliminación de la Relación?.'
  123. + #13#10 + 'Esta operación no podrá deshacerse.',
  124. PWideChar(Self.Caption), MB_YESNO + MB_ICONQUESTION + MB_DEFBUTTON2)) then
  125. begin
  126. NombreUsuario:=grdUsuariosxRoles.CellByName['clUsuarioRxU', grdUsuariosxRoles.SelectedRow].AsString;
  127. NombreRol:=grdUsuariosxRoles.CellByName['clRolRxU', grdUsuariosxRoles.SelectedRow].AsString;
  128. with DataModule1 do
  129. begin
  130. terminarTransaccion;
  131. transaccion.StartTransaction;
  132. try
  133. QuitarRol(NombreUsuario, NombreRol, qRoles);
  134. //Los usuarios x roles
  135. UsuariosxRoles(qRoles);
  136. transaccion.CommitRetaining;
  137. LimpiarNextGrid(grdUsuariosxRoles);
  138. CargarNextGrid(grdUsuariosxRoles, qRoles);
  139. transaccion.Commit;
  140. except
  141. on e:Exception do
  142. begin
  143. terminarTransaccion;
  144. mErrores(e, 'Operación solicitada falló...', self.Caption);
  145. end;
  146. end;
  147. end;
  148. end
  149. else
  150. begin
  151. Application.MessageBox('Debe seleccionar un registro de la grilla (Usuario x Rol)',
  152. PWideChar(self.Caption), MB_OK + MB_ICONERROR);
  153. end;
  154. end;
  155.  
  156. procedure TfrmRolesxUsuarios.btnSalirClick(Sender: TObject);
  157. begin
  158. Close;
  159. end;
  160.  
  161. procedure TfrmRolesxUsuarios.FormClose(Sender: TObject; var Action: TCloseAction);
  162. begin
  163. Action:=caFree;
  164. end;
  165.  
  166. procedure TfrmRolesxUsuarios.Usuarios(SecurityServices:TFDIBSecurity);
  167. begin
  168. //grupo:=AnsiupperCase(trim(txtGrupo.Text));
  169. with memUsuarios do
  170. begin
  171. //Los filtros de búsqueda
  172. Filtered := False;
  173. Filter := 'UserName <> ' + QuotedStr('SYSDBA');
  174. //+ 'AND UserName LIKE ' + QuotedStr('%' + nombre + '%');
  175. Filtered := True;
  176. try
  177. SecurityServices.DisplayUsers;
  178. memUsuarios.AttachTable(SecurityServices.Users, nil);
  179. memUsuarios.Open;
  180. // grdUsuarios.Columns[1].Visible:=False; //Password
  181. // grdUsuarios.Columns[2].Visible:=False; //FirstName
  182. // grdUsuarios.Columns[3].Visible:=False; //MiddleName
  183. // grdUsuarios.Columns[4].Visible:=False; //LastName
  184. // grdUsuarios.Columns[5].Visible:=False; //UserID
  185. // grdUsuarios.Columns[6].Visible:=False; //GroupID
  186. // grdUsuarios.Columns[7].Visible:=False; //GroupName
  187. // grdUsuarios.Columns[8].Visible:=False; //RoleName
  188. except
  189. raise;
  190. end;
  191. end;
  192. end;
  193.  
  194. procedure TfrmRolesxUsuarios.FormShow(Sender: TObject);
  195. begin
  196. with DataModule1 do
  197. begin
  198. terminarTransaccion;
  199. transaccion.StartTransaction;
  200. try
  201. //Los usuarios
  202. Usuarios(security_services);
  203. //Los roles
  204. Roles(qRoles);
  205. LimpiarNextGrid(grdRoles);
  206. CargarNextGrid(grdRoles, qRoles);
  207. //Los usuarios x roles
  208. UsuariosxRoles(qRoles);
  209. LimpiarNextGrid(grdUsuariosxRoles);
  210. CargarNextGrid(grdUsuariosxRoles, qRoles);
  211. transaccion.Commit;
  212. except
  213. on e:Exception do
  214. begin
  215. terminarTransaccion;
  216. mErrores(e, 'No se pudieron recuperar los Usuarios.', 'Gestión de Usuarios.');
  217. end;
  218. end;
  219. end;
  220. end;
  221.  
  222.  
  223. //El formulario de ABM de Usuarios
  224. procedure TfrmABMAgentes.btnElimUsuarioClick(Sender: TObject);
  225. var
  226. MiUsuario:string;
  227. begin
  228. //showmessage(IntToSTr(tblUsuarios.RecNo));
  229. with DataModule1 do
  230. begin
  231. //Eliminación del usuario
  232. if tblUsuarios.RecNo > 0 then
  233. begin
  234. MiUsuario:=tblUsuarios.FieldByName('UserName').AsString;
  235. //showmessage(MiUsuario);
  236. if idYes = Application.MessageBox(PWideChar('¿Confirma eliminación de Usuario?'
  237. + #13#10 + 'Esta operación NO PODRÁ DESHACERSE.'
  238. + #13#10 + 'Usuario: ' + MiUsuario), 'Gestión de usuarios,',
  239. MB_YESNO + MB_ICONQUESTION + MB_DEFBUTTON2) then
  240. begin
  241. terminarTransaccion;
  242. transaccion.StartTransaction;
  243. try
  244. //Si es vendedor, la desactivamos
  245. CambiarEstadoVendedor(MiUsuario, 'INACTIVO', qUsuarios);
  246. //Eliminamos el usuario de la BD.
  247. security_services.AUserName:=MiUsuario;
  248. security_services.DeleteUser;
  249. transaccion.Commit;
  250. Application.MessageBox('Eliminación de usuario terminada.',
  251. PWideChar(self.Caption), MB_OK + MB_ICONINFORMATION);
  252. tblUsuarios.Refresh;
  253. except
  254. on e:Exception do
  255. begin
  256. terminarTransaccion;
  257. mErrores(e, 'Imposible eliminar usuario seleccionado.', self.Caption);
  258. end;
  259. end;
  260. end; //del segundo if
  261. end
  262. else
  263. begin
  264. Application.MessageBox('Debe seleccionar un Usuario,',
  265. PWideChar(self.Caption), MB_OK + MB_ICONERROR);
  266. end;
  267. end; //del with
  268. end;
  269.  
  270. procedure TfrmABMAgentes.btnNuevoUsuarioClick(Sender: TObject);
  271. begin
  272. ventana_modal(TfrmNuevoUsuario);
  273. end;
  274.  
  275. procedure TfrmABMAgentes.btnBuscarUsuariosClick(Sender: TObject);
  276. var
  277. nombre,
  278. grupo: string;
  279. begin
  280. nombre:=AnsiupperCase(trim(txtUsuario.Text));
  281. //grupo:=AnsiupperCase(trim(txtGrupo.Text));
  282. with tblUsuarios, DataModule1 do
  283. begin
  284. //Los filtros de búsqueda
  285. Filtered := False;
  286. Filter := 'UserName <> ' + QuotedStr('SYSDBA')
  287. + 'AND UserName LIKE ' + QuotedStr('%' + nombre + '%');
  288. Filtered := True;
  289. terminarTransaccion;
  290. transaccion.StartTransaction;
  291. try
  292. security_services.DisplayUsers;
  293. tblUsuarios.AttachTable(security_services.Users, nil);
  294. tblUsuarios.Open;
  295. grdUsuarios.Columns[1].Visible:=False; //Password
  296. grdUsuarios.Columns[5].Visible:=False; //UserID
  297. grdUsuarios.Columns[6].Visible:=False; //GroupID
  298. grdUsuarios.Columns[7].Visible:=False; //GroupName
  299. grdUsuarios.Columns[8].Visible:=False; //RoleName
  300. transaccion.Commit;
  301. except
  302. on e:Exception do
  303. begin
  304. terminarTransaccion;
  305. mErrores(e, 'No se pudieron recuperar los Usuarios.', 'Gestión de Usuarios.');
  306. end;
  307. end;
  308. end;
  309. end;
  310.  
  311. procedure TfrmABMAgentes.FormClose(Sender: TObject; var Action: TCloseAction);
  312. begin
  313. Action:=caFree;
  314. end;
  315.  
  316.  
  317. procedure TfrmABMAgentes.BtnSalirClick(Sender: TObject);
  318. begin
  319. Close;
  320. end;

Herramientas:

DelphiXE5

Firebird 2.5

FireDAC

 

Muchas gracias.

Archivos adjuntos


Editado por santiago14, 07 junio 2017 - 07:31 .

  • 0

#4 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 07 junio 2017 - 02:37

Juraba que te referías a los roles de Firebird (SYSDBA y demás creadas), por eso no comenté nada.  :p 


  • 0

#5 ELKurgan

ELKurgan

    Advanced Member

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

Escrito 07 junio 2017 - 11:21

Gracias por compartir la solución

 

Saludos


  • 0

#6 santiago14

santiago14

    Advanced Member

  • Miembros
  • PipPipPip
  • 334 mensajes
  • LocationCerrillos - Salta - Argentina

Escrito 08 junio 2017 - 08:26

Por nada compañeros.

 

Les cuento.

Cuando hice una modificación de los datos de un Usuario puse en su MiddleName la palabra "Ramón" y me dio un error. Pero cuando puse "Ramon" (Nótese la falta del acento), pasó sin drama.

Sin embargo, cuando hice la creación de ese usuario había puesto en su MiddleName "José" (Con acento) y no tuvo demasiado inconveniente en registrarlo.

 

¿Comentarios? Gracias.


  • 0

#7 santiago14

santiago14

    Advanced Member

  • Miembros
  • PipPipPip
  • 334 mensajes
  • LocationCerrillos - Salta - Argentina

Escrito 08 junio 2017 - 08:34

Por nada compañeros.

 

Les cuento.

Cuando hice una modificación de los datos de un Usuario puse en su MiddleName la palabra "Ramón" y me dio un error. Pero cuando puse "Ramon" (Nótese la falta del acento), pasó sin drama.

Sin embargo, cuando hice la creación de ese usuario había puesto en su MiddleName "José" (Con acento) y no tuvo demasiado inconveniente en registrarlo.

 

¿Comentarios? Gracias.

 

Rectifico, cuando ponemos texto con caracteres "extraños" (acentos y demás) no pasa; pero cuando van sin ellos, no tiene drama.

Ahora sí, ¿comentarios?

 

Gracias.


  • 0

#8 sir.dev.a.lot

sir.dev.a.lot

    Advanced Member

  • Miembros
  • PipPipPip
  • 545 mensajes
  • Location127.0.0.1

Escrito 22 junio 2017 - 05:47

Gracias por compartir la Solucion!

 

Muy util...

 

Saludos


  • 0




IP.Board spam blocked by CleanTalk.