Autor Tema: Ocultar Paginas segun tipo de usuarios  (Leído 23339 veces)

0 Usuarios y 4 Visitantes están viendo este tema.

Desconectado eduardo91

  • Sv Jr.
  • **
  • Mensajes: 50
Ocultar Paginas segun tipo de usuarios
« : julio 31, 2012, 07:22:13 pm »
Estoy realizando una aplicación asp.net que sera el proyecto final de la materia de programación en la universidad, el proyecto es crear un tipo portal donde habrán 2 tipos de usuarios alumnos y docentes he creado 2 master page con sus respectivos menús y paginas según el tipo de usuario y cuando se loguean recupero el tipo de usuario que es y según eso lo redirecciono a la master page con su menú y paginas correspondientes pero me tengo una duda.

Como ya dije cuando se loguea según el tipo de usuario lo redirecciona a diferentes paginas  pero resulta que si después que se loguea escribe en la barra de direcciones una pagina que no corresponde a su tipo de usuario la pagina se carga entonces quiero controlar esto que si escribe en la barra de direcciones una pagina que no sea de su tipo de usuario no la muestre.

Como podría implementarlo no quiero usar membership porque ya tengo estructurada mi bd, así que quiero encontrar una manera de resolver lo que planteo por medio de código.

Desconectado el-mago

  • The Communiter-
  • *
  • Mensajes: 2040
Re:Ocultar Paginas segun tipo de usuarios
« Respuesta #1 : julio 31, 2012, 08:15:13 pm »
hace en cada pagina o como un include, para que no escribas tanto en c/u... una comprobación simple, digamos que almacenaste en la variable "tipo", el tipo de usuario.

0 = usuario normal
1 = docente

if(tipo == 1)
se muestra la pagina a la que el solo los docentes tienen acceso
else
lo regresa al master de usuario normal, con el código de redireccion vea.

o mas simple:
if(tipo != 1)
redireccion

esto iria al cargar la pagina, antes de cualquier impresión de codigo. y solo en las paginas donde los docentes tienen acceso

algo asi es la idea, no es el codigo exacto pero la idea asi va..

Suerte.
« Última Modificación: julio 31, 2012, 08:17:48 pm por el-mago »
Paquete WebHosting + Dominio desde US$35.00/año cPanel || Consulta sin compromiso!

Desconectado edu_guerr

  • Sv Member
  • ***
  • Mensajes: 463
Re:Ocultar Paginas segun tipo de usuarios
« Respuesta #2 : julio 31, 2012, 08:21:48 pm »
Con una sesion no te servira?  crear una sesion de usuario(docente o alumno) en el login, y con esa sesion validas a quien mostrar la pagina.

Desconectado eduardo91

  • Sv Jr.
  • **
  • Mensajes: 50
Re:Ocultar Paginas segun tipo de usuarios
« Respuesta #3 : julio 31, 2012, 09:11:57 pm »
hace en cada pagina o como un include, para que no escribas tanto en c/u... una comprobación simple, digamos que almacenaste en la variable "tipo", el tipo de usuario.

0 = usuario normal
1 = docente

if(tipo == 1)
se muestra la pagina a la que el solo los docentes tienen acceso
else
lo regresa al master de usuario normal, con el código de redireccion vea.

o mas simple:
if(tipo != 1)
redireccion

esto iria al cargar la pagina, antes de cualquier impresión de codigo. y solo en las paginas donde los docentes tienen acceso

algo asi es la idea, no es el codigo exacto pero la idea asi va..

Suerte.

Algo así había pensado, pero esto me tocaría ir haciéndolo en todas las paginas que solo los docentes tengan acceso vdd? y el código  iría en el evento load de cada pagina si no me equivoco

Desconectado eduardo91

  • Sv Jr.
  • **
  • Mensajes: 50
Re:Ocultar Paginas segun tipo de usuarios
« Respuesta #4 : julio 31, 2012, 09:18:59 pm »
La mejor forma no es redirigir de un índice a una u otra página, además de que no es muy escalable si después se necesita agregar más categorías (habría que modificar un documento "semiestático" por categoría).

La forma más directa en la que se pueda evitar ese problema es tener el índice en cuestión (una única URL para un único índice), y que no redirija a diferentes páginas, sino que esta imprima directamente una "plantilla" para cada tipo de usuario. Así todos los documentos de la aplicación web sirven solo la interfaz para cada tipo de usuario.

Idealmente sería una serie de IFs que determinan qué plantilla imprimir, y esas plantillas deberían estar fuera del directorio accesible desde Internet, o por lo menos muy bien escondidos, en directorios que nadie pueda encontrar en Internet.
Te capte mas o menos la idea pero la vdd no sabría como implementarla, la aplicación no estará en internet es un proyecto para hacerlo de forma local

Desconectado el-mago

  • The Communiter-
  • *
  • Mensajes: 2040
Re:Ocultar Paginas segun tipo de usuarios
« Respuesta #5 : julio 31, 2012, 09:20:59 pm »
Con una sesion no te servira?  crear una sesion de usuario(docente o alumno) en el login, y con esa sesion validas a quien mostrar la pagina.
Si, creo yo que seria lo ideal, que se creara la variable de session al momento de un correcto login, pero es el mismo punto, el ya tiene el tipo de usuario almacenado en una variable.

Algo así había pensado, pero esto me tocaría ir haciéndolo en todas las paginas que solo los docentes tengan acceso vdd? y el código  iría en el evento load de cada pagina si no me equivoco
yo te aconsejo hacer un include, como lo dije anteriormente. digamos

docentes.aspx
<% codigo de comprobación a nivel 1 %>

estudiantes.aspx
<% codigo de comprobación a nivel 0 %>

y pones en tu pagina dentro del body <!-- #INCLUDE FILE="docentes o estudiantes.aspx" -->  según sea tu elección de comprobación si queres restringir acceso a docentes a algunas de estudiantes. Con esto estas incluyendo el codigo de docentes.aspx en la pagina y no tenes que digitar el codigo de docentes.aspx en c/u, solo colocas la linea del include.
Paquete WebHosting + Dominio desde US$35.00/año cPanel || Consulta sin compromiso!

Desconectado eduardo91

  • Sv Jr.
  • **
  • Mensajes: 50
Re:Ocultar Paginas segun tipo de usuarios
« Respuesta #6 : julio 31, 2012, 09:23:06 pm »
Con una sesion no te servira?  crear una sesion de usuario(docente o alumno) en el login, y con esa sesion validas a quien mostrar la pagina.
Te refieres de hacerlo como me lo dijeron en la primera respuesta de ir validando el tipo de usuario en las paginas y en función de esto mostrar o no el contenido.

Desconectado eduardo91

  • Sv Jr.
  • **
  • Mensajes: 50
Re:Ocultar Paginas segun tipo de usuarios
« Respuesta #7 : julio 31, 2012, 09:29:27 pm »

docentes.aspx
<% codigo de comprobación a nivel 1 %>

estudiantes.aspx
<% codigo de comprobación a nivel 0 %>

y pones en tu pagina dentro del body <!-- #INCLUDE FILE="docentes o estudiantes.aspx" -->  según sea tu elección de comprobación si queres restringir acceso a docentes a algunas de estudiantes. Con esto estas incluyendo el codigo de docentes.aspx en la pagina y no tenes que digitar el codigo de docentes.aspx en c/u, solo colocas la linea del include.
A lo de include no lo entiendo muy bien nunca lo he usado. te refieres a que dentro de las etiquetas <%  %> estaría el código en c# para comprobar que tipo de usuario es y en base a esto decidir si muestra o no la pagina

Desconectado el-mago

  • The Communiter-
  • *
  • Mensajes: 2040
Re:Ocultar Paginas segun tipo de usuarios
« Respuesta #8 : julio 31, 2012, 09:37:15 pm »
si, ahi va el codigo de comprobación.
luego lo guardas como docentes.aspx*ejemplo vea
y ahi queda el codigo, despues pones en las paginas que queres que se ejecute ese codigo, el codigo del include, tal como lo dice lo incluye, es como que el codigo estubiese en la pagina, pero no, esta en otra y este codigo lo jala.
Paquete WebHosting + Dominio desde US$35.00/año cPanel || Consulta sin compromiso!

Desconectado eduardo91

  • Sv Jr.
  • **
  • Mensajes: 50
Re:Ocultar Paginas segun tipo de usuarios
« Respuesta #9 : julio 31, 2012, 09:56:15 pm »
si, ahi va el codigo de comprobación.
luego lo guardas como docentes.aspx*ejemplo vea
y ahi queda el codigo, despues pones en las paginas que queres que se ejecute ese codigo, el codigo del include, tal como lo dice lo incluye, es como que el codigo estubiese en la pagina, pero no, esta en otra y este codigo lo jala.
Ya te entendí es como tipo  php que haces los include, mañana pruebo y comento como me fue.
Gracias por las respuestas.

Desconectado Non Servium

  • Sv Member
  • ***
  • Mensajes: 426
  • Ilix Punx :)
Re:Ocultar Paginas segun tipo de usuarios
« Respuesta #10 : julio 31, 2012, 10:31:09 pm »
Yo lo que considero más conveniente para estos casos es crear perfiles para usuarios. También una tabla en la bd con menús y una asociativa entre ambas. De la siguiente forma:

Menús
Id_Menu
Nombre
Url (aquí irá por ejemplo "~/Catalogos/Alumnos.aspx")

Usuarios
Id_Usuario
Id_Perfil
NombreUsuario
Identificador
Contraseña

Perfiles
Id_Perfil
NombrePerfil

PerfilesPermisos
Id_PerfilPermiso
Id_Menu
Id_Perfil
PermisoLectura
PermisoEscritura
PermisoEliminacion

Poniendo simplemente los campos básicos de la estructura...

Luego para no escribir en cada página el código para validar, en el "OnInit" (hacer override de la función) de la master podes validar si el Id_Perfil de alguna sesión está en en "AppRelativeVirtualPath" (Url) con un query relacionando las tablas, si no está usas Response.Redirect("~/Inicio.aspx")

Es una idea casi vaga pero acomodá las ideas y te queda una aplicación tentativamente segura...
♫ Condenados a perder la libertad! Por no acatar las leyes que les asignaron. ♪ ♫
Decididos, decididos a emprender! Un camino largo y duro por no ser esclavos ♫


Watch

Desconectado Juancho

  • The Communiter-
  • *
  • Mensajes: 1311
Re:Ocultar Paginas segun tipo de usuarios
« Respuesta #11 : julio 31, 2012, 11:52:31 pm »
Vaya mita la forma mas fácil es utilizar el Web.Config y CustomMemberShipProvider
Creas 2 carpetas, una donde vas a guardar las paginas para docentes y otra para las paginas d usuraio normal.
Luego desde el Web.Config, haces una denegación d acceso a la carpeta de docentes y especificas que usuarios van a tener acceso, y lo mismo para la otra carpeta.
Y listo, eso es todo.

Si quieres hacerlo ya con roles, tendrías que implementar además un CustomRoleProvider, entonces con ellos en el web.config en vez d conceder a usuario específicos, vas a conceder a usuario que estén en el rol X...

como ya tienes tu propia base de datos es obligación que hagas tus CustomMembershipProvider y CustomRoleProvider para que se adecue. A tu sistemas
<a href="http://www.gametracker.com/player/%7BAiPI%7DJuancho/94.127.17.72:11480/" target="_blank">
<img src="http://cache.www.gametracker.com/player/%7BAiPI%7DJuancho/94.127.17.72:11480/b_560x95.png" border="0" width="560" height="95" alt="" />
</a>

Desconectado mxgxw

  • Global Moderator
  • The Communiter-
  • *
  • Mensajes: 5665
  • Starlet - 999cc
    • mxgxw
Re:Ocultar Paginas segun tipo de usuarios
« Respuesta #12 : agosto 01, 2012, 08:19:21 am »
Esto es algo que se necesita hacer muy frecuentemente en casi cualquier portal y usualmente no es tan sencillo como parece.

Yo generalmente utilizo permisos por grupo/objeto.

Cada usuario pertenece a un grupo y cada grupo tiene acceso a ciertos objetos. Al final intento crear una clase que verifique que el grupo tenga acceso al objeto especificado y en base a eso se permite el acceso.

Por ejemplo:

Tabla usuarios:
IdUsuario (PK)

Tabla grupos:
IdGrupo (PK)

Tabla usuarios_grupo
IdGrupo (PK)(FK)
IdUsuario (PK)(FK)

Tabla Objetos:
IdObjeto (PK)
NameObjeto (UNIQUE idx)

Tabla Acceso_Objetos
IdGrupo (PK)(FK)
IdObjeto (PK)(FK)

Tendrías que crear una clase que tome el usuario y ejecute un código como este:

Código: [Seleccionar]

SELECT
  COUNT(*) AS ACCESO_OBJETOS
FROM  acceso_objetos
INNER JOIN
  usuarios_grupo ON
  usuarios_grupo.IdGrupo=acceso_objetos.IdGrupo
INNER JOIN
  usuarios ON
  usuarios.IdUsuario=usuarios_grupo.IdUsuario
WHERE
  IdUsuario=@IdUsuario AND
  NameObjeto=@NameObjeto

Ese select devuelve >0 si existe acceso al objeto o 0 si no.

Podes tener una clase con una funcion algo así:

Código: [Seleccionar]
bool CheckAccess(int IdUsuario,string NameObjeto) {
   /*** TODO: PREPARAR CONSULTA ***/
    If(sql.ExecuteScalar()> 0) {
      return true;
    } else {
      return false;
    }
}

Y en tu código de cada página podes tener algo como:

Código: [Seleccionar]
void OnPageLoad(...)
   If(Acceso.CheckAccess(Session['IdUsuario'],"menu_principal")) {
       // ejecutar codigo de inicializacion
   } else {
       // redireccionar a pagina de error o login
   }
}

La ventaja con este método es que podes luego definir los permisos como vos querras, es muy granular y fácil de implementar y lo podes "pegar" en los OnPageLoad que tengás.

Ahora... podes ir un poco más lejos y asociar los permisos a cada nombre de clase y cargar las clases correspondientes a la página en tu lista de objetos. Nada te limita a usarlo como querras incluso podes mostrar/ocultar opciones de menu dependiendo del grupo al que pertenescan solo colocando los "If" correspondientes. por ejemplo:

Grupo "Admin"
Objetos:
-->menu
-->menuadmin
-->agregar_usuarios
-->eliminar_usuarios
-->ver_usuarios

Grupo "Usuarios"
Objetos:
-->menu
-->ver_usuarios

Ejemplo:
Código: [Seleccionar]

<% If(Acceso.CheckAccess(Session['IdUsuario'],"menu")) { %>
<ul>
<% If(Acceso.CheckAccess(Session['IdUsuario'],"menuadmin")) { %>
  <li>Agregar usuarios</li>
  <li>Borrar usuarios</li>
<% } %>
  <li>ver Usuarios</li>
</ul>
<% } %>

Ojo que este método es plano, también pueden hacer un "arbol de permisos" que vaya heredando el acceso a objetos, pero para fines prácticos este método de acceso por grupo a nivel de objeto pienso que cubre la mayoría de necesidades de permisos.

Nota: Se que en .Net se pueden usar los RoleProvider, pero esto no es difícil de implementar se puede aplicar a muchos lenguajes y lo siento en lo personal más simple.


P.D.: Algunas recomendaciones extra:

1-La clase que verifica el acceso tiene que tener acceso a una conexión, en mi experiencia he encontrado que es mejor usar la misma conexión que está utilizando la página. Esto es para evitar que esté generando varias conexiones diferentes solo para chequear permisos.

2-Si no quieren estar haciendo un SQL para cada checkAccess, como en el caso que quieran habilitar/deshabilitar funciones en la página que se envía al cliente, pueden en la inicialización de la clase bajar todos los objetos a los que tiene permiso elusuario y guardarlo en memoria con un select como este:

Código: [Seleccionar]
SELECT DISTINCT
   NameObjeto
FROM  acceso_objetos
INNER JOIN
  usuarios_grupo ON
  usuarios_grupo.IdGrupo=acceso_objetos.IdGrupo
INNER JOIN
  usuarios ON
  usuarios.IdUsuario=usuarios_grupo.IdUsuario
WHERE
  IdUsuario=@IdUsuario
Nota: Se usa DISTINCT para que elimine nombres de objetos duplicados en caso que el usuario perteneciera a distintos grupos con acceso al mismo objeto. El resultado de esta consulta se puede guardar en un vector de strings.

Luego la función CheckAccess solo necesita el nombre del objeto:

Código: [Seleccionar]
bool CheckAccess(string NameObjeto) {
   foreach(string obj in userObjects) {
     if(obj.Equals(NameObjeto)) {
       return true;
     }
   }
   return false;
}

3-De nuevo repito, yo utilizo mucho este "sistema" de permisos porque es fácil de implementar y no requiere tocar archivos de configuración. Si hay algo que DETESTO con mi corazón es que para montar un sistema de autenticación y permisos sencillo se tenga que estar tocando 20 archivos diferentes o heredar 20 clases diferentes.

4-MUY, PERO MUY IMPORTANTE: Yo se que esto es básico, pero lo he visto tantas veces que vale la pena mencionarlo: El IdUsuario de sesión NUNCA PERO NUNCA tiene que ser establecido desde variables que vengan del cliente, SIEMPRE tiene que establecerse como variable de sesión en el lado del servidor luego de haber verificado las credenciales del usuario. Si  no lo hacen de esta manera corren el riesgo de que su aplicación sea vulnerable a ataques de escalado de privilegios.

5-Por qué me gusta esto más que las ACL. Simple, esto es una ACL pero sin complicaciones, la tabla de acceso_grupos es tu ACL pero es como la "lista de invitados" no está en la lista no entra. Además que una clase armada de esta manera te permite verificar el acceso ADENTRO DE la página. Hay algo que nunca me gustó de CakePHP por ejemplo es que sus ACL te obligan a que toda la vista esté asociada a una ACL. ¿Pero que tal si yo quiero que partes de la página se muestren a los admin y otras a los usuarios? Yo no voy a hacer una vista para un admin y una vista para un usuario normal cuando lo único que cambia es el botón. Si bien hay páginas en que queres tener un sistema como las ACL de CakePHP con permisos heredados y acceso por clases, acciones muchas veces el mismo diseño que tiene te restringe y sale incluso más flexible usando un sistema como este.

6-No todo es color de rosa XD si no tienen cuidado pueden tener 40,000 objetos que no saben nisiquiera que hacen. Una buena forma de verificar esto es que la aplicación "registre los objetos" es decir que si se hace un "CheckAccces" para un objeto que no existe este objeto se cree en la BD con la ref al codigo y luego se puede hacer un "cleanup" para ver si realmente se están utilizando todos los objetos definidos en la base.
« Última Modificación: agosto 01, 2012, 09:09:02 am por mxgxw »


Desconectado eduardo91

  • Sv Jr.
  • **
  • Mensajes: 50
Re:Ocultar Paginas segun tipo de usuarios
« Respuesta #13 : agosto 01, 2012, 03:25:18 pm »
Yo lo que considero más conveniente para estos casos es crear perfiles para usuarios. También una tabla en la bd con menús y una asociativa entre ambas. De la siguiente forma:

Menús
Id_Menu
Nombre
Url (aquí irá por ejemplo "~/Catalogos/Alumnos.aspx")

Usuarios
Id_Usuario
Id_Perfil
NombreUsuario
Identificador
Contraseña

Perfiles
Id_Perfil
NombrePerfil

PerfilesPermisos
Id_PerfilPermiso
Id_Menu
Id_Perfil
PermisoLectura
PermisoEscritura
PermisoEliminacion

Poniendo simplemente los campos básicos de la estructura...

Luego para no escribir en cada página el código para validar, en el "OnInit" (hacer override de la función) de la master podes validar si el Id_Perfil de alguna sesión está en en "AppRelativeVirtualPath" (Url) con un query relacionando las tablas, si no está usas Response.Redirect("~/Inicio.aspx")

Es una idea casi vaga pero acomodá las ideas y te queda una aplicación tentativamente segura...
Me parece interesante como lo planteas lo analizare.

Desconectado eduardo91

  • Sv Jr.
  • **
  • Mensajes: 50
Re:Ocultar Paginas segun tipo de usuarios
« Respuesta #14 : agosto 01, 2012, 03:32:30 pm »
Vaya mita la forma mas fácil es utilizar el Web.Config y CustomMemberShipProvider
Creas 2 carpetas, una donde vas a guardar las paginas para docentes y otra para las paginas d usuraio normal.
Luego desde el Web.Config, haces una denegación d acceso a la carpeta de docentes y especificas que usuarios van a tener acceso, y lo mismo para la otra carpeta.
Y listo, eso es todo.

Si quieres hacerlo ya con roles, tendrías que implementar además un CustomRoleProvider, entonces con ellos en el web.config en vez d conceder a usuario específicos, vas a conceder a usuario que estén en el rol X...

como ya tienes tu propia base de datos es obligación que hagas tus CustomMembershipProvider y CustomRoleProvider para que se adecue. A tu sistemas
La primera opción como seria, como se aria la denegación de usuarios desde el Web.Config tendria que usar membership que te crea la bd y luego configurarla como tu dices porque si es así es lo que quiero evitar que me cree una bd ya que yo tengo que implementar una propia.

No tenes por ahi algun link donde se explique lo de CustomRoleProvider