Ir al contenido


Foto

[RESUELTO] niveles de acceso a una aplicacion


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

#1 abraham85

abraham85

    Advanced Member

  • Miembros
  • PipPipPip
  • 128 mensajes

Escrito 08 enero 2010 - 11:39

hola gente como estan? la verdad que estube viendo el foro y esta muy bueno, felicitaciones a los que llevan todo este trabajo adelante.
bueno mi consulta es la siguiente: stoy aprendiendo a usar delphi y stoy haciendo una aplicacion para aprender. Aprendi a hacer la ventanita de login gracias a uno de los hilos de Caral en dond va xplicando sto de muy buena manera, me descargue el ejemplo y lo segui paso a paso.
Ahora lo q me gustaria hacer, es poder hacer q distintos usuarios tengan acceso a diferentes partes de una aplicacion dependiendo de nivel de jerarquia dentro d la aplicacion. como por ejemplo q el administrador tenga acceso a una parte del menu en dond se puedan agregar mas usuarios, y que un usuario comun no pueda ver esa opcion, se entiende?
bueno spero q me puedan orientar. un abrazo gente. hasta luego  :wink:
  • 0

#2 Caral

Caral

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.266 mensajes
  • LocationCosta Rica

Escrito 08 enero 2010 - 11:48

Hola
Me gustaria saber como accedes al login.
Esto puede ser por medio del form principal o directo.
La verdad no me acuerdo del tutorial. :(
Si el programa esta hecho con BD access puedes ponerlo aqui para verlo, sera mas facil.
Saludos
  • 0

#3 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.945 mensajes
  • LocationMéxico

Escrito 08 enero 2010 - 11:53

Te voy a contar como yo lo hago, :p

En la tabla de usuarios agrego un campo de tipo varchar llamado permisos. Allí armo una cadena del tipo 0000000000000000000000000000000000, cada posición representa el acceso a un catálogo o módulo del sistema.

Luego cuando los pongo a 1 siginifca que el usuario tiene acceso, caso contrario no tiene acceso.

bueno así le hago yo



  • 0

#4 abraham85

abraham85

    Advanced Member

  • Miembros
  • PipPipPip
  • 128 mensajes

Escrito 08 enero 2010 - 11:58

bueno..el ejemplo que hizo Caral staba echo en access...pero yo lo voy a hacer con sql server..asi q lo stoy adaptando...el codigo era ste :



delphi
  1. unit UFLogin;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7.   Dialogs, StdCtrls, DB, ADODB;
  8.  
  9. type
  10.   TFLogin = class(TForm)
  11.     ADOConnection1: TADOConnection;
  12.     ADLogin: TADOQuery;
  13.     ADLoginCodUsuario: TWideStringField;
  14.     ADLoginClave: TWideStringField;
  15.     Label1: TLabel;
  16.     Label2: TLabel;
  17.     EUsuario: TEdit;
  18.     EClave: TEdit;
  19.     BtnOk: TButton;
  20.     BtnCancel: TButton;
  21.     procedure BtnOkClick(Sender: TObject);
  22.     procedure BtnCancelClick(Sender: TObject);
  23.     procedure FormCreate(Sender: TObject);
  24.   private
  25.     { Private declarations }
  26.   public
  27.     { Public declarations }
  28.   end;
  29.  
  30. var
  31.   FLogin: TFLogin;
  32.   Cuenta : integer;
  33.   Usuario : String;
  34.   LoginOK : boolean;
  35.  
  36. implementation
  37.  
  38. uses UFClientes;
  39.  
  40. {$R *.dfm}
  41.  
  42. procedure TFLogin.BtnOkClick(Sender: TObject);
  43. begin
  44.     LoginOK := False;
  45.   ADLogin.Parameters.ParamByName('nom').Value:= EUsuario.Text;
  46.   ADLogin.Active:= True;
  47.   EUsuario.Text:= ADLogin.Fields[1].AsString;
  48.   If ADLogin.RecordCount < 1 then
  49.     Begin
  50.       Cuenta := Cuenta + 1;
  51.       MessageDlg('Usuario no encontrado',mtError, [mbOK], 0);
  52.       EUsuario.Text := '';
  53.       EClave.Text := '';
  54.       ADLogin.Active := False;
  55.       If Cuenta = 3 then Close;
  56.     end
  57.   else
  58.       If ADLoginClave.AsString = EClave.Text then
  59.         Begin
  60.           LoginOk := True;
  61.           ADLogin.Active := False;
  62.           FClientes:=TFClientes.Create(self);
  63.           try
  64.           FLogin.Visible:= False;
  65.           FClientes.ShowModal;
  66.           finally
  67.           FClientes.Free;
  68.           end;
  69.           Close;
  70.         end
  71.     else
  72.         Begin
  73.           Cuenta := Cuenta + 1;
  74.           MessageDlg('Clave Inválida',mtError, [mbOK], 0);
  75.           EClave.Text := '';
  76.           ADLogin.Active := False;
  77.           If Cuenta = 3 then Close;
  78.         end;
  79.  
  80. end;
  81.  
  82. procedure TFLogin.BtnCancelClick(Sender: TObject);
  83. begin
  84.     LoginOK :=False;
  85.   Close;
  86. end;
  87.  
  88. procedure TFLogin.FormCreate(Sender: TObject);
  89. begin
  90.     Cuenta := 0;
  91.   Usuario := '';
  92.  
  93. end;
  94.  
  95. end.


  • 0

#5 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 08 enero 2010 - 12:00

Hola abraham85,
Bienvenido a DelphiAccess,

Una manera de hacer eso es disponiendo de una tabla Perfiles y asociar a cada usuario un perfil. De este modo se conseguiría una relación 1-M entre Perfiles y Usuarios. Al final se consigue algo como esto:
ID - Perfil
1 - Administrador
2 - Técnico
...
N - ETC

Este ID refleja el nivel de acceso, el 1 tendría acceso a todo, el 2 a algunas cosas... etc.

Luego, en el sistema se puede emplear el uso de la propiedad TAG de los menús, botones, etc y guardar en ésta el nivel de acceso (o dicho de otro modo, el ID)

Cuando el usuario se logea en la aplicación tu obtienes su el ID asociado a su perfil y lo comparas con el TAG de todos los controles. De este modo puedes dehabilitar/ocultar los controles si el nivel de acceso no coincide con el ID.

Podrías disponer de un procedimiento algo como:



delphi
  1. procedure HabilitarControles(NivelAcceso: integer);
  2. begin
  3. // aquí el código
  4. end;



Espero que se entienda.

Este esquema es relativamente sencillo de implementar. Sería oportuno como menciona Caral que nos describas y/o nos muestres como estás enfocando tu sistema para tener una idea más acabada de lo que llevas hecho y como se puede elaborar lo que buscas.

Saludos,
  • 0

#6 Caral

Caral

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.266 mensajes
  • LocationCosta Rica

Escrito 08 enero 2010 - 12:15

Hola
Ese es el codigo del form login.
En ese form lo que se hace es comprobar si el usuario es o no es el adecuado revisando la BD.
Para dar acceso a cierta parte del programa lo que hago es similar a lo que hace poliburro.
En la tabla donde estan los usuarios se pone un campo mas, este lo hago o bien numérico o text y contiene los niveles de acceso que van del 1 en adelante.
Lo que hago es que cuando un usario entra, no solo se verifica su nombre y clave, tambien se verifica su numero de acceso.
En mi caso lo que hago es inhabilitar ciertos botones del form principal.
En el boton OK:



delphi
  1. procedure TFLogin.BtnOkClick(Sender: TObject);
  2. begin
  3.   LoginOK :=False;
  4.   AdoQuery1.Parameters.ParamByName(&#39;Cod&#39;).Value:= Edit1.Text;
  5.   AdoQuery1.Active:= True;
  6. //  Edit1.Text:= AdoQuery1.Fields[0].AsString;
  7.   If AdoQuery1.Fields[3].AsString = &#39;1&#39; then
  8.     // todo
  9.   begin
  10.   // todo
  11.   end;
  12.   If AdoQuery1.Fields[3].AsString = &#39;2&#39; then
  13.   // bodega
  14.   begin
  15.       FmainForm.BitBtn15.Enabled := False;
  16.     FmainForm.BitBtn14.Enabled := True;
  17.     FmainForm.BitBtn8.Enabled := True;
  18.     FmainForm.BitBtn23.Enabled := False;
  19.     FmainForm.BitBtn24.Enabled := False;
  20.     FmainForm.PopupMenu7.Items[7].Enabled:= False;
  21.     FmainForm.PopupMenu7.Items[8].Enabled:= False;
  22.    
  23.   end;
  24.     If AdoQuery1.Fields[3].AsString = &#39;3&#39; then
  25.   // produccion, acabado, acrilico
  26.   begin
  27.     FmainForm.BitBtn6.Enabled := False;
  28.     FmainForm.BitBtn7.Enabled := False;
  29.     FmainForm.BitBtn1.Enabled := False;
  30.     FmainForm.BitBtn15.Enabled := False;
  31.     FmainForm.BitBtn13.Enabled := False;
  32.     FmainForm.BitBtn4.Enabled := False;
  33.     FmainForm.BitBtn14.Enabled := False;
  34.     FmainForm.BitBtn8.Enabled := False;
  35.     FmainForm.BitBtn27.Enabled := False;
  36.     FmainForm.BitBtn21.Enabled := False;
  37.     FmainForm.BitBtn22.Enabled := False;
  38.     FmainForm.PopupMenu7.Items[22].Enabled:= False;
  39.     FmainForm.PopupMenu7.Items[23].Enabled:= False;
  40.     FmainForm.PopupMenu7.Items[24].Enabled:= False;
  41.     FmainForm.PopupMenu7.Items[25].Enabled:= False;
  42.     FmainForm.PopupMenu7.Items[26].Enabled:= False;
  43.     end;
  44.   If AdoQuery1.Fields[3].AsString = &#39;4&#39; then
  45.   // recepcion
  46.   begin
  47.     FmainForm.BitBtn1.Enabled := False;
  48.     FmainForm.BitBtn3.Enabled := False;
  49.     FmainForm.BitBtn5.Enabled := False;
  50.     FmainForm.BitBtn7.Enabled := False;
  51.     FmainForm.BitBtn8.Enabled := False;
  52.     FmainForm.BitBtn27.Enabled := False;
  53.     FmainForm.BitBtn24.Enabled := False;
  54.     FmainForm.Timer2.Enabled := False;
  55.     FmainForm.PopupMenu7.Items[10].Enabled:= False;
  56.     FmainForm.PopupMenu7.Items[11].Enabled:= False;
  57.     FmainForm.PopupMenu7.Items[12].Enabled:= False;
  58.     FmainForm.PopupMenu7.Items[13].Enabled:= False;
  59.     FmainForm.PopupMenu7.Items[14].Enabled:= False;
  60.     FmainForm.PopupMenu7.Items[15].Enabled:= False;
  61.     FmainForm.PopupMenu7.Items[16].Enabled:= False;
  62.     FmainForm.PopupMenu7.Items[19].Enabled:= False;
  63.     end;
  64.     If AdoQuery1.Fields[3].AsString = &#39;5&#39; then
  65.   // asistente
  66.   begin
  67.     FmainForm.BitBtn17.Enabled := False;
  68.     FmainForm.BitBtn25.Enabled := False;
  69.     FmainForm.PopupMenu7.Items[15].Enabled:= False;
  70.     FmainForm.PopupMenu7.Items[16].Enabled:= False;
  71.     FmainForm.Recibos.Items[0].Enabled:= False;
  72.  
  73.   end;
  74.   If AdoQuery1.RecordCount < 1 then
  75.     Begin
  76.       Cuenta := Cuenta + 1;
  77.       MessageDlg(&#39;Usuario no encontrado&#39;,mtError, [mbOK], 0);
  78.       Edit1.Text := &#39;&#39;;
  79.       Edit2.Text := &#39;&#39;;
  80.       AdoQuery1.Active := False;
  81.       If Cuenta = 3 then Close;
  82.     end
  83.   else
  84.       If AdoQuery1Clave.AsString = Edit2.Text then
  85.         Begin
  86.           LoginOk := True;
  87.           Usuario := AdoQuery1CodUsuario.AsString;
  88.           Nombre := AdoQuery1Nombre.AsString;
  89.           AdoQuery1.Active := False;
  90.           Close;
  91.         end
  92.     else
  93.         Begin
  94.           Cuenta := Cuenta + 1;
  95.           MessageDlg(&#39;Clave Inválida&#39;,mtError, [mbOK], 0);
  96.           Edit2.Text := &#39;&#39;;
  97.           AdoQuery1.Active := False;
  98.           If Cuenta = 3 then Close;
  99.         end;
  100.  
  101. end;



Tambien se puede hacer por variable en el form principal, esto es mas facil:
Cuando se crea el form este verifica el valor que esta incluido en este caso en un label:



delphi
  1. procedure TFPrincipal.FormShow(Sender: TObject);
  2. begin
  3.   If label2.Caption = &#39;1&#39; then
  4.     // todo
  5.   begin
  6.   // todo
  7.   end;
  8.   If label2.Caption = &#39;2&#39; then
  9.   //asistente
  10.   begin
  11.   BitBtn4.Enabled:= False;
  12.   end;
  13.   If label2.Caption = &#39;3&#39; then
  14.   // produccion
  15.   begin
  16.   BitBtn3.Enabled:= False;
  17.   BitBtn4.Enabled:= False;
  18.   end;
  19.   If label2.Caption = &#39;4&#39; then
  20.   // bodega
  21.   begin
  22.   BitBtn3.Enabled:= False;
  23.   BitBtn4.Enabled:= False;
  24.   BitBtn6.Enabled:= False;
  25.   end;
  26. end;


Espero te sirvan los ejemplos.
Por cierto ya subí el tutorial a la zona de descarga.
Saludos




  • 0

#7 abraham85

abraham85

    Advanced Member

  • Miembros
  • PipPipPip
  • 128 mensajes

Escrito 08 enero 2010 - 12:33

polirrubro, delphius y Caral! me quedo todo muy claro! voy a hacer las pruebas de lo q me recomendaron.
Muchas Gracias. por casualidad no tienen algun ejemplito por ahi? hehehehehe  :wink:

Muchas Gracias gente..muy amables todos!

  • 0

#8 Caral

Caral

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.266 mensajes
  • LocationCosta Rica

Escrito 08 enero 2010 - 12:35

Hola

polirrubro, delphius y Caral! me quedo todo muy claro! voy a hacer las pruebas de lo q me recomendaron.
Muchas Gracias. por casualidad no tienen algun ejemplito por ahi? hehehehehe  :wink:

Muchas Gracias gente..muy amables todos!

De que necesitas el ejemplo amigo?.
Con gusto te hago uno.
Saludos
  • 0

#9 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 08 enero 2010 - 12:40

Hola

Yo estoy implementando este asunto con lo que comentó Delphius, y lo que yo estoy haciendo es utilizar los TAG's de las acciones del TActionManager, en mi base de datos agregué 3 tablas

1 tabla para cada uno de los módulos del Menú
1 tabla de usuarios
1 tabla de Permisos donde relaciono al usuario con los módulos.

En el momento de que el usuario ingresa al sistema cargo sus permisos y actúo en consecuencia.



delphi
  1. procedure TfrmPrincipal.AccionXExecute(Sender: TObject);
  2. begin
  3.   if Permisos.Tag in Privilegios then
  4.   begin
  5.     //Se generan las acciones
  6.   end
  7.   else begin
  8.         ShowMessage(&#39;Usted NO está autorizado para entrar a éste módulo.&#39;);
  9.   end;
  10. end;



También pueden utilizar el habilitar o deshabilitar las opciones del menú como por ejemplo lo hice en éste hilo.

En mi caso específico lo hice dentro de la ejecución de las acciones, no me pregunten porqué :).

Salud OS
  • 0

#10 abraham85

abraham85

    Advanced Member

  • Miembros
  • PipPipPip
  • 128 mensajes

Escrito 08 enero 2010 - 12:44

me referia a un ejemplo sobre lo q proponen. o si ya tenian un sistemita echo por ahi en dond hayan implementado el tema q stamos tratando  :wink:

saludos a todos.
  • 0

#11 Caral

Caral

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.266 mensajes
  • LocationCosta Rica

Escrito 08 enero 2010 - 12:51

Hola
Me gustaria saber que quieres inhabilitar en el form principal?.
Menu, botones, popupmenu, que?.
Como lo quieres hacer?.
Por tabla, por ini, por variable?.
Como te comente amigo, hay muchas maneras de hacer las cosas.
Incluso usando el viejo amigo TAG, que por cierto esta ahí y nunca sirve para nada que una variable no haga. :D
Tu pide, veremos que sale.
Saludos
  • 0

#12 abraham85

abraham85

    Advanced Member

  • Miembros
  • PipPipPip
  • 128 mensajes

Escrito 08 enero 2010 - 01:05

hola caral...bueno  lo q necesito hacer es que el administrador y el usuario comun tenga acceso a un form por llamarle "articulos ", y solo el administrador pueda agregar,eliminar o buscar articulos, y el usuario comun tenga habiblitado el boton  buscar. 
la verdad que nose cual de de las formas de hacerlo es la mas "correcta" o "eficiente".
pero podriamos tratar de hacerlo por variable, y yo despues intentar hacerlo por tabla.

muchas Gracias a todos.
  • 0

#13 Caral

Caral

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.266 mensajes
  • LocationCosta Rica

Escrito 08 enero 2010 - 01:11

Hola
A ver que se me ocurre.
Trabajando..................
Saludos
  • 0

#14 Caral

Caral

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.266 mensajes
  • LocationCosta Rica

Escrito 08 enero 2010 - 02:06

Hola
Listo:
Un ejemplo sencillo, con campo aceso en la tabla (access).
En este momento hay dos usuarios:
usuario caral, clave car. aceso total (1).
usuario nada, clave nad, aceso restringido (2).
Ya me comentaras.
Saludos

Archivos adjuntos


  • 0

#15 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 08 enero 2010 - 02:15

Simple, sencillo y sin complicarse, ya  no eres un Novato amigo Caral.

Salud OS
  • 0

#16 abraham85

abraham85

    Advanced Member

  • Miembros
  • PipPipPip
  • 128 mensajes

Escrito 08 enero 2010 - 02:40

usted es un maestro CARAL  :cool: mis mas sinceros respetos  :angel:
muchas gracias por su tiempo
mas claro imposible  ;)
saludos y muchas gracias a todos.
  • 0

#17 Caral

Caral

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.266 mensajes
  • LocationCosta Rica

Escrito 13 enero 2010 - 06:23

Hola
Esta pregunta me la hace abraham85 por mensaje privado:

tengo un pequeño problema

sabes me sale un mensaje d error "el nombre de la columna nom no es valido"
ese error me sale cuando ingreso un usuario y contraseña y le doy OK y despues me marca
sta parte del codigo

El codigo que muestra es el codigo del boton OK del login.
Bien, dicho esto veamos las posivilidades:
1- la BD (SQLServer) no se configura igual que ACCESS por esta razon no entiende el parametro (Lo dudo).
2- No se ha colocado el parametro en el adoquery, por esta razon no lo ve (muy posible).
3- La sentencia sql se ha cambiado en el query y no configuraron el parametro. (posible)
Espero el comentario de nuestro amigo abraham85 para que nos amplie la informacion.
Saludos


  • 0

#18 abraham85

abraham85

    Advanced Member

  • Miembros
  • PipPipPip
  • 128 mensajes

Escrito 14 enero 2010 - 05:45

hola gente :tongue: como estan?
bueno he configurado el addoconecction para q trabaje con sqlserver, y tambien le he indicado la BD correspondiente y no he tenido problemas :wink:
en el Adoquery le agregue en los Parameters a "nom" con value NULL, panullable:true, datatype:ftwideString, numericScale:255, precision:255 and size:510.
en el SQLString del adoquery he cambiado la sentencia sql por sta


delphi
  1. SELECT login, pass, acceso  FROM usuario WHERE login = nom



y en el adoquery he agregado los fields (login,pass,acceso) y  me genero las variables correspondientes


delphi
  1. ADLoginlogin: TStringField;
  2.     ADLoginpass: TStringField;
  3.     ADLoginacceso: TIntegerField;


nose si hay alguna propiedad que me falta configurar con SQLserver

muchas gracias a todos

  • 0

#19 Caral

Caral

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.266 mensajes
  • LocationCosta Rica

Escrito 14 enero 2010 - 07:18

Hola
Hay muchas formas de hacer las cosas, empecemos por lo que tienes:
Tienes un adoquery al que se le ha colocado en su propiedad string este codigo:


delphi
  1. SELECT login, pass, acceso  FROM usuario WHERE login = nom


NO se si sqlserver lo entiende, este simple cambio serviria:


delphi
  1. SELECT login, pass, acceso  FROM usuario WHERE login = :nom


Los parametros del query serian estos:
Imagen Enviada

Ahora si queremos hacer las cosas mejor podriamos definir la sentencia sql directamente en el codigo asi:
En el boto OK:



delphi
  1. procedure TFLogin.BtnOkClick(Sender: TObject);
  2. begin
  3.     LoginOK := False;
  4.   ADLogin.Sql.Text:= &#39;SELECT login, pass, acceso  FROM Usuario WHERE login = :nom&#39;;
  5.   ADLogin.Parameters[0].Value:= EUsuario.Text;
  6.   ADLogin.Active:= True;
  7.  
  8.   //aqui sigue lo demas........



Espero que se entienda, es muy posible que el parámetro no sea reconocido, por eso es que lanza el error.
Saludos


  • 0

#20 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.040 mensajes
  • LocationSanto Domingo

Escrito 14 enero 2010 - 08:53

tanto con ado como con zeos y otros si no se ponen los dos puntos : despues del igual, entonces no lo reconoce como un parametro.
  • 0




IP.Board spam blocked by CleanTalk.