none
privilegio a tipo de usuario en mi login RRS feed

  • Pregunta

  • quisiera que cuando le de ingresar a mis datos en el login, y el llame el formulario mdi si los datos son correcto, pero quisiera saber como darle a ese usuario el privilegio de usar los tipos de botones que hay en el formulario mdi. por ejemplo: una vez sea llamado el formulario mdi, lo que haga es analizar que tipo de usuario es, si administrador, miembro o invitado y dependiendo del tipo de usuario se activen o desactiven los botones que ahi se encuentran.

    tengo dos tablas en sql server:

    1- (Usuario) que contiene los siguientes valores 

          [CodTipo]
          ,[Usuario]
          ,[Pasword] 

    2- (TipoUsuario) que contiene estos valores:

           [CodTipo]
          ,[TipoRol]

    sábado, 23 de julio de 2016 21:12

Respuestas

  • Puestos a hacerlo bien hecho, yo me apoyaría en la infraestructura de control de usuarios y roles que tiene .Net. Para ello, en el formulario de Login guardamos el usuario y los roles dentro de un GenericPrincipal (necesitarás importar el espacio de nombres System.Security.Principal). Puesto que en ese Login ya estás accediendo a la base de datos para validar el usuario, cabe presumir que ya tienes metida toda la lógica de acceso a datos y ya sabes acceder a la base de datos. No has dicho qué tecnología usas, así que voy a presumir que es EntityFramework, pero si usaras cualquier otra el principio básico es el mismo: se leen los registros y se guardan en variables. Supongamos que ya tienes en una variable el CodTipo, porque lo leíste de la tabla cuando validaste la password del usuario. Si he entendido bien cómo tienes organizada la información, se supone que en la tabla de roles tienes varios registros cuyo CodTipo coincide con el CodTipo del usuario, y detrás viene el TipoRol correspondiente. Pues bien, los textos de ese TipoRol hay que pasarlos a un array de strings. Si estás usando EF el código sería así (y si no estás usando EF, debiste explicar en tu pregunta cuál es la técnica de acceso a datos que estás usando):

    Dim roles as String() = (from r in contexto.TablaRoles where r.CodTipo=codTipo select r.TipoRol).ToArray()

    Una vez que tenemos eso, lo cargamos en el GenericPrincipal así:

    Dim identity as New GenericIdentity(nombreDeUsuario)

    Dim principal as New GenericPrincipal(identity, roles)

    Y lo salvamos dentro de .Net asignándoselo al CurrentThread:

    System.Threading.Thread.CurrentPrincipal = principal

    Todo eso va en el formulario de Login. Una vez ejecutadas esas instrucciones, .Net ya sabe cuál es el usuario y cuáles son sus roles. Y podemos consultarlo en cualquier sitio del programa. Por ejemplo, si en un formulario cualquiera quieres habilitar un botón únicamente si el usuario tiene el rol "Administrador" (ese es el texto exacto que antes hemos leido de TipoRol y que hemos metido en el array "roles"):

    button1.Enabled = System.Threading.Thread.CurrentPrincipal.IsInRole("Administrador")

    lunes, 25 de julio de 2016 6:10

Todas las respuestas

  • Simplemente, en el evento Load del formulario (o en el constructor, después del InitializeComponent) lees los datos desde la tabla, miras qué roles tiene el usuario, y haces Enable o Disable de cada botón según los roles que ese botón requiera. No creo que merezca la pena complicarse mucho más que esto, salvo que tengas algún requisito adicional que no sea obvio en tu pregunta.
    domingo, 24 de julio de 2016 8:06
  • en los roles, en la posición 1 esta administrador, 2 miembro, 3 invitado... si eres tan amable en darme un ejemplo por fa.. 
    lunes, 25 de julio de 2016 1:19
  • Puestos a hacerlo bien hecho, yo me apoyaría en la infraestructura de control de usuarios y roles que tiene .Net. Para ello, en el formulario de Login guardamos el usuario y los roles dentro de un GenericPrincipal (necesitarás importar el espacio de nombres System.Security.Principal). Puesto que en ese Login ya estás accediendo a la base de datos para validar el usuario, cabe presumir que ya tienes metida toda la lógica de acceso a datos y ya sabes acceder a la base de datos. No has dicho qué tecnología usas, así que voy a presumir que es EntityFramework, pero si usaras cualquier otra el principio básico es el mismo: se leen los registros y se guardan en variables. Supongamos que ya tienes en una variable el CodTipo, porque lo leíste de la tabla cuando validaste la password del usuario. Si he entendido bien cómo tienes organizada la información, se supone que en la tabla de roles tienes varios registros cuyo CodTipo coincide con el CodTipo del usuario, y detrás viene el TipoRol correspondiente. Pues bien, los textos de ese TipoRol hay que pasarlos a un array de strings. Si estás usando EF el código sería así (y si no estás usando EF, debiste explicar en tu pregunta cuál es la técnica de acceso a datos que estás usando):

    Dim roles as String() = (from r in contexto.TablaRoles where r.CodTipo=codTipo select r.TipoRol).ToArray()

    Una vez que tenemos eso, lo cargamos en el GenericPrincipal así:

    Dim identity as New GenericIdentity(nombreDeUsuario)

    Dim principal as New GenericPrincipal(identity, roles)

    Y lo salvamos dentro de .Net asignándoselo al CurrentThread:

    System.Threading.Thread.CurrentPrincipal = principal

    Todo eso va en el formulario de Login. Una vez ejecutadas esas instrucciones, .Net ya sabe cuál es el usuario y cuáles son sus roles. Y podemos consultarlo en cualquier sitio del programa. Por ejemplo, si en un formulario cualquiera quieres habilitar un botón únicamente si el usuario tiene el rol "Administrador" (ese es el texto exacto que antes hemos leido de TipoRol y que hemos metido en el array "roles"):

    button1.Enabled = System.Threading.Thread.CurrentPrincipal.IsInRole("Administrador")

    lunes, 25 de julio de 2016 6:10