Principales respuestas
Mecanismo para otorgar denegar permisos por tipo de usuario C# y SQL SERVER 2014

Pregunta
-
Buenos días a todos.
me gustaría que me ayuden a despejar las dudas que tengo, para que me entiendan mejor ire por artes
tengo mi tabla empleados y desde mi tabla empleados a la persona que contraten para digitador por decir o personas que va a tratar en el sistema le creo un usuario rmelgar por ejemplo y le asigno el tipo de usuario que es.
mi tabla cargos
Id_Cargo Nombre_Cargo
----------- ------------------------------
1 Administrador
2 Digitador
(2 filas afectadas)mi tabla usuarios
IdUsuario Usuario Clave IdCargo IdEmpleado
----------- -------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------- -----------
1 rmelgar 1 1
2 pmelgar 2 1
3 mmelgar 2 3
(3 filas afectadas)
ahora les comento como hago yo para restringir segun el tipo de usuario
por ejemplo si el usuario es administrador hago mi condicional así
Mediante una consulta recibo el Tipo de Usuario
en program
namespace CapaPresentacion { static class Program { public static int IdCargo; // aquí recibo el tipo de usuario /// <summary> /// Punto de entrada principal para la aplicación. /// </summary> [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new FormLogin()); } }
y por ejemplo para denegar hago algo como esto
private void FormPadre_Load(object sender, EventArgs e) { Habilitar(); } private void Habilitar() { if (Program.IdCargo != 1) { administraciónToolStripMenuItem.Enabled = false; DevoluciondeClienteToolStripButton.Enabled = false; traspasoToolStripMenuItem.Enabled = false; devolucionesToolStripMenuItem.Enabled = false; } }
ahora se me entro la duda, que pasaría si al momento de poblar la tabla Cargos la poblarían de esta manera
Id_Cargo Nombre_Cargo
----------- ------------------------------
1 Digitador
2 Administradorse dan cuenta que mi administrador ya queda con el Id_Cargo 2 ya no funcionaria ya que yo estoy fijando mi condicional y eso me seria un problema.
o peor aun si hago mi condicional con el nombre de esta manera
if (Program.NombreCargo != "Administrador") { administraciónToolStripMenuItem.Enabled = false; DevoluciondeClienteToolStripButton.Enabled = false; traspasoToolStripMenuItem.Enabled = false; devolucionesToolStripMenuItem.Enabled = false; }
y que al momento de poblar los datos en vez administrador ingresen Admin, o ADM o algún otro nombre, mi condicional no funcionaria.
entonces pregunto de que manera se hace esta parte.
agradeceré la ayuda que me puedan brindar
Roberto
Respuestas
-
Hola Roberto:
Si creas el usuario, luego le asignas los privilegios, (Cuando tengas muchos permisos, podrías cargarlos directamente desde una plantilla, por defecto)....pero eso es más adelante.
El if, ...te diste cuenta que cree un usuario Administracion, le puse que no era administador, pero no le di ningún permiso.
Como en tu código, tienes un objeto Program, que se supone que tiene asignados los atributos que tienes en la tabla. entonces, lo primero que miro es si no es null en el campo is_administradorModulo1, porque ahora tienes un solo modulo o parte de aplicación, pero dentro de 6 meses puedes tener varios módulos, y cada uno puede ser independiente del otro.
Por otro lado, tienes un checkbox, que tiene 3 valores. Chequeado, Nochequeado, e Indeterminado, que son lo mismo que en la base de datos, tendrás 1=chequeado, 0=nochequeado, null=indeterminado.
Pero ya sabes que en C# los valores null, no son nada agradecidos y no se pueden comparar, ni trabajar.
Lo primero es saber si no es nulo. A los efectos, es igual que sea porque nadie ha guardado el registro o que tenga un 0 realmente no tiene permisos.
Yo lo que busco es si no es nulo y su valor es uno entonces, tengo permisos. Primero siempre se compara con null, ya sea mediante !=null ==null o hasValue y una vez que esto se ha pasado, ya puedes comparar con un valor.
Espero no haberte liado mucho
- Marcado como respuesta Roberto C. Melgar miércoles, 13 de marzo de 2019 14:35
Todas las respuestas
-
Buen día Roberto,
Desde tu aplicación, en el connection string, seguramente tenés configurado un usuario estándar SQL.
Dicho usuario estándar, dentro del Motor de Base de Datos podrá tener privilegios a determinados objetos, pero no podrías cambiar (limitando o concediendo mas permisos) desde la Aplicación.
Es decir, deberías tener distintos usuarios SQL para poder tener distintos permisos a nivel de SQL.
Espero haber comprendido bien tu situación..
Saludos!
_____________________________________________________
Francisco Ingaramo Microsoft Certified Professional blog: https://dbownerblog.wordpress.com/- Editado Francisco Ingaramo viernes, 8 de marzo de 2019 13:36 firma
- Marcado como respuesta Pablo RubioModerator viernes, 8 de marzo de 2019 18:13
- Desmarcado como respuesta Pablo RubioModerator viernes, 8 de marzo de 2019 18:13
- Propuesto como respuesta Pablo RubioModerator viernes, 8 de marzo de 2019 18:13
-
Buen día Francisco, la verdad lo que me intento hacer es restringir el acceso a objetos de la aplicación por ejemplo que no vean ciertos formularios, o que no se le habiliten ciertos botones por dar un ejemplo.
pero gracias
espero resolver esta duda
Roberto
- Propuesto como respuesta Pablo RubioModerator viernes, 8 de marzo de 2019 18:13
-
Hola Roberto C. Melgar:
Si tus usuarios de aplicación son los encargados de crear los nombres de los objetos, entonces dos opciones simples:
Opción 1: Tabla con permisos por columnas tipo bit.
Columna 1 rol, columna2 permisoparahaceralgo, columna3 permisoparahacerotracosa, columna4 permison.
Cuando se inserta un rol, se inserta tambien una entrada en esta tabla. con todo denegado, por ejemplo.
Y el usuario que da de alta el rol x tiene que explicitamente venir a permitir al rol x el permiso para hacer.
Opción 2. La misma tabla del rol tiene x columnas para cada cosa. y es en el propio rol, donde se dan acceso a los permisos.
Solo hay un campo adicional, que es el administrador, que puede ser incluso una columna, y quien tiene esta columna puede gestionar todo. El resto, solo pueden gestionar lo que tu programaticamente quieras.
Nota adicional: De cualquier modo, tu programa tiene que tener algun registro, bien sea hardcodeado, o bien sea porque ya das la base de datos, con una fila cubierta, o porque si se crea el primer registro, este se le da permiso a todo, para poder lidiar con los permisos. Como esto siempre es complejo, para un usuario nuevo, lo más, lógico, es que des algún registro tipo ya insertado.
-
-
Imagino que escoges la opción más simple, que es poner en la tabla cargos, las columnas con los permisos:
create table cargos ( id_Cargo int identity (1,1) primary key, nombre_Cargo varchar(100) not null, is_Administrador bit, is_AdministradorModulo1 tinyint , is_readModulo1 tinyint, is_writeModulo1 tinyint, is_viewModulo1 tinyint); go insert into cargos ( nombre_Cargo, is_Administrador, is_AdministradorModulo1, is_readModulo1, is_viewModulo1, is_writeModulo1) values ('Administrator',1,1,1,1,1); go insert into cargos (nombre_Cargo,is_Administrador, is_AdministradorModulo1, is_readModulo1, is_viewModulo1, is_writeModulo1) values ('Administracion',0,null,null,null,null) go select * from cargos
Y como pregunto:
if (Program.is_AdministradorModulo1!=null && Program.isAdministradorModulo1==1)
Esta podría ser una opción.
-
cada vez mas claro,
muchas gracias Javi me planteo este escenario
y la verdad no es que cambien de idea pero ahora viendo mas claro como es el mecanismo le expongo lo siguiente
ya no importa si el usuario es o no administrador, con este escenario puedo dar tres dar dos o uno al usuario o estoy equivocado? si puedo hacerlo de esta forma entonces quedaría en estos pasos
1 creo mi usuario y asigno su cargo
2.- luego de creado mi usuario decido que privilegios tendría es correcto lo que pienso o estoy equivocado estimado.
y por favor no entiendo muy bien eso de mi condición if un poquito mas de explicación por favor y mil disculpas
gracias
Roberto
-
Hola Roberto:
Si creas el usuario, luego le asignas los privilegios, (Cuando tengas muchos permisos, podrías cargarlos directamente desde una plantilla, por defecto)....pero eso es más adelante.
El if, ...te diste cuenta que cree un usuario Administracion, le puse que no era administador, pero no le di ningún permiso.
Como en tu código, tienes un objeto Program, que se supone que tiene asignados los atributos que tienes en la tabla. entonces, lo primero que miro es si no es null en el campo is_administradorModulo1, porque ahora tienes un solo modulo o parte de aplicación, pero dentro de 6 meses puedes tener varios módulos, y cada uno puede ser independiente del otro.
Por otro lado, tienes un checkbox, que tiene 3 valores. Chequeado, Nochequeado, e Indeterminado, que son lo mismo que en la base de datos, tendrás 1=chequeado, 0=nochequeado, null=indeterminado.
Pero ya sabes que en C# los valores null, no son nada agradecidos y no se pueden comparar, ni trabajar.
Lo primero es saber si no es nulo. A los efectos, es igual que sea porque nadie ha guardado el registro o que tenga un 0 realmente no tiene permisos.
Yo lo que busco es si no es nulo y su valor es uno entonces, tengo permisos. Primero siempre se compara con null, ya sea mediante !=null ==null o hasValue y una vez que esto se ha pasado, ya puedes comparar con un valor.
Espero no haberte liado mucho
- Marcado como respuesta Roberto C. Melgar miércoles, 13 de marzo de 2019 14:35