none
Mecanismo para otorgar denegar permisos por tipo de usuario C# y SQL SERVER 2014 RRS feed

  • 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           Administrador

    se 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

    viernes, 8 de marzo de 2019 13:27

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

    viernes, 8 de marzo de 2019 22:13

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  bloghttps://dbownerblog.wordpress.com/
    viernes, 8 de marzo de 2019 13:36
  • 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

    viernes, 8 de marzo de 2019 14:03
  • 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.

    viernes, 8 de marzo de 2019 19:42
  • Javi que amable, voy entendiendo.

    ahora mi condicional if como tendría que plantearse?

    gracias

    Roberto

    viernes, 8 de marzo de 2019 20:34
  • 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.

    viernes, 8 de marzo de 2019 21:14
  • 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

    viernes, 8 de marzo de 2019 21:59
  • 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

    viernes, 8 de marzo de 2019 22:13