[RESUELTO] niveles de acceso a una aplicacion
#1
Escrito 08 enero 2010 - 11:39
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
#2
Escrito 08 enero 2010 - 11:48
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
#3
Escrito 08 enero 2010 - 11:53
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
#4
Escrito 08 enero 2010 - 11:58
unit UFLogin; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, DB, ADODB; type TFLogin = class(TForm) ADOConnection1: TADOConnection; ADLogin: TADOQuery; ADLoginCodUsuario: TWideStringField; ADLoginClave: TWideStringField; Label1: TLabel; Label2: TLabel; EUsuario: TEdit; EClave: TEdit; BtnOk: TButton; BtnCancel: TButton; procedure BtnOkClick(Sender: TObject); procedure BtnCancelClick(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var FLogin: TFLogin; Cuenta : integer; Usuario : String; LoginOK : boolean; implementation uses UFClientes; {$R *.dfm} procedure TFLogin.BtnOkClick(Sender: TObject); begin LoginOK := False; ADLogin.Parameters.ParamByName('nom').Value:= EUsuario.Text; ADLogin.Active:= True; EUsuario.Text:= ADLogin.Fields[1].AsString; If ADLogin.RecordCount < 1 then Begin Cuenta := Cuenta + 1; MessageDlg('Usuario no encontrado',mtError, [mbOK], 0); EUsuario.Text := ''; EClave.Text := ''; ADLogin.Active := False; If Cuenta = 3 then Close; end else If ADLoginClave.AsString = EClave.Text then Begin LoginOk := True; ADLogin.Active := False; FClientes:=TFClientes.Create(self); try FLogin.Visible:= False; FClientes.ShowModal; finally FClientes.Free; end; Close; end else Begin Cuenta := Cuenta + 1; MessageDlg('Clave Inválida',mtError, [mbOK], 0); EClave.Text := ''; ADLogin.Active := False; If Cuenta = 3 then Close; end; end; procedure TFLogin.BtnCancelClick(Sender: TObject); begin LoginOK :=False; Close; end; procedure TFLogin.FormCreate(Sender: TObject); begin Cuenta := 0; Usuario := ''; end; end.
#5
Escrito 08 enero 2010 - 12:00
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:
procedure HabilitarControles(NivelAcceso: integer); begin // aquí el código 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,
#6
Escrito 08 enero 2010 - 12:15
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:
procedure TFLogin.BtnOkClick(Sender: TObject); begin LoginOK :=False; AdoQuery1.Parameters.ParamByName('Cod').Value:= Edit1.Text; AdoQuery1.Active:= True; // Edit1.Text:= AdoQuery1.Fields[0].AsString; If AdoQuery1.Fields[3].AsString = '1' then // todo begin // todo end; If AdoQuery1.Fields[3].AsString = '2' then // bodega begin FmainForm.BitBtn15.Enabled := False; FmainForm.BitBtn14.Enabled := True; FmainForm.BitBtn8.Enabled := True; FmainForm.BitBtn23.Enabled := False; FmainForm.BitBtn24.Enabled := False; FmainForm.PopupMenu7.Items[7].Enabled:= False; FmainForm.PopupMenu7.Items[8].Enabled:= False; end; If AdoQuery1.Fields[3].AsString = '3' then // produccion, acabado, acrilico begin FmainForm.BitBtn6.Enabled := False; FmainForm.BitBtn7.Enabled := False; FmainForm.BitBtn1.Enabled := False; FmainForm.BitBtn15.Enabled := False; FmainForm.BitBtn13.Enabled := False; FmainForm.BitBtn4.Enabled := False; FmainForm.BitBtn14.Enabled := False; FmainForm.BitBtn8.Enabled := False; FmainForm.BitBtn27.Enabled := False; FmainForm.BitBtn21.Enabled := False; FmainForm.BitBtn22.Enabled := False; FmainForm.PopupMenu7.Items[22].Enabled:= False; FmainForm.PopupMenu7.Items[23].Enabled:= False; FmainForm.PopupMenu7.Items[24].Enabled:= False; FmainForm.PopupMenu7.Items[25].Enabled:= False; FmainForm.PopupMenu7.Items[26].Enabled:= False; end; If AdoQuery1.Fields[3].AsString = '4' then // recepcion begin FmainForm.BitBtn1.Enabled := False; FmainForm.BitBtn3.Enabled := False; FmainForm.BitBtn5.Enabled := False; FmainForm.BitBtn7.Enabled := False; FmainForm.BitBtn8.Enabled := False; FmainForm.BitBtn27.Enabled := False; FmainForm.BitBtn24.Enabled := False; FmainForm.Timer2.Enabled := False; FmainForm.PopupMenu7.Items[10].Enabled:= False; FmainForm.PopupMenu7.Items[11].Enabled:= False; FmainForm.PopupMenu7.Items[12].Enabled:= False; FmainForm.PopupMenu7.Items[13].Enabled:= False; FmainForm.PopupMenu7.Items[14].Enabled:= False; FmainForm.PopupMenu7.Items[15].Enabled:= False; FmainForm.PopupMenu7.Items[16].Enabled:= False; FmainForm.PopupMenu7.Items[19].Enabled:= False; end; If AdoQuery1.Fields[3].AsString = '5' then // asistente begin FmainForm.BitBtn17.Enabled := False; FmainForm.BitBtn25.Enabled := False; FmainForm.PopupMenu7.Items[15].Enabled:= False; FmainForm.PopupMenu7.Items[16].Enabled:= False; FmainForm.Recibos.Items[0].Enabled:= False; end; If AdoQuery1.RecordCount < 1 then Begin Cuenta := Cuenta + 1; MessageDlg('Usuario no encontrado',mtError, [mbOK], 0); Edit1.Text := ''; Edit2.Text := ''; AdoQuery1.Active := False; If Cuenta = 3 then Close; end else If AdoQuery1Clave.AsString = Edit2.Text then Begin LoginOk := True; Usuario := AdoQuery1CodUsuario.AsString; Nombre := AdoQuery1Nombre.AsString; AdoQuery1.Active := False; Close; end else Begin Cuenta := Cuenta + 1; MessageDlg('Clave Inválida',mtError, [mbOK], 0); Edit2.Text := ''; AdoQuery1.Active := False; If Cuenta = 3 then Close; end; 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:
procedure TFPrincipal.FormShow(Sender: TObject); begin If label2.Caption = '1' then // todo begin // todo end; If label2.Caption = '2' then //asistente begin BitBtn4.Enabled:= False; end; If label2.Caption = '3' then // produccion begin BitBtn3.Enabled:= False; BitBtn4.Enabled:= False; end; If label2.Caption = '4' then // bodega begin BitBtn3.Enabled:= False; BitBtn4.Enabled:= False; BitBtn6.Enabled:= False; end; end;
Espero te sirvan los ejemplos.
Por cierto ya subí el tutorial a la zona de descarga.
Saludos
#7
Escrito 08 enero 2010 - 12:33
Muchas Gracias. por casualidad no tienen algun ejemplito por ahi? hehehehehe
Muchas Gracias gente..muy amables todos!
#8
Escrito 08 enero 2010 - 12:35
De que necesitas el ejemplo amigo?.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
Muchas Gracias gente..muy amables todos!
Con gusto te hago uno.
Saludos
#9
Escrito 08 enero 2010 - 12:40
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.
procedure TfrmPrincipal.AccionXExecute(Sender: TObject); begin if Permisos.Tag in Privilegios then begin //Se generan las acciones end else begin ShowMessage('Usted NO está autorizado para entrar a éste módulo.'); end; 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
#10
Escrito 08 enero 2010 - 12:44
saludos a todos.
#11
Escrito 08 enero 2010 - 12:51
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.
Tu pide, veremos que sale.
Saludos
#12
Escrito 08 enero 2010 - 01:05
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.
#13
Escrito 08 enero 2010 - 01:11
A ver que se me ocurre.
Trabajando..................
Saludos
#14
Escrito 08 enero 2010 - 02:06
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
#15
Escrito 08 enero 2010 - 02:15
Salud OS
#16
Escrito 08 enero 2010 - 02:40
muchas gracias por su tiempo
mas claro imposible
saludos y muchas gracias a todos.
#17
Escrito 13 enero 2010 - 06:23
Esta pregunta me la hace abraham85 por mensaje privado:
El codigo que muestra es el codigo del boton OK del login.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
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
#18
Escrito 14 enero 2010 - 05:45
bueno he configurado el addoconecction para q trabaje con sqlserver, y tambien le he indicado la BD correspondiente y no he tenido problemas
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
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
ADLoginlogin: TStringField; ADLoginpass: TStringField; ADLoginacceso: TIntegerField;
nose si hay alguna propiedad que me falta configurar con SQLserver
muchas gracias a todos
#19
Escrito 14 enero 2010 - 07:18
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:
SELECT login, pass, acceso FROM usuario WHERE login = nom
NO se si sqlserver lo entiende, este simple cambio serviria:
SELECT login, pass, acceso FROM usuario WHERE login = :nom
Los parametros del query serian estos:
Ahora si queremos hacer las cosas mejor podriamos definir la sentencia sql directamente en el codigo asi:
En el boto OK:
procedure TFLogin.BtnOkClick(Sender: TObject); begin LoginOK := False; ADLogin.Sql.Text:= 'SELECT login, pass, acceso FROM Usuario WHERE login = :nom'; ADLogin.Parameters[0].Value:= EUsuario.Text; ADLogin.Active:= True; //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
#20
Escrito 14 enero 2010 - 08:53