/Razor.Role

Gestion de roles en Razor

Primary LanguageC#

Razor.Role

Basicamente es una prueba dew concepto:

  • Recibe en el controlador, a traves de la querystring (?role=algo) una variable que identifica el nombre del supuesto rol.
  • Crea en el ViewBag una variable llamada Role con dicho valor, que es pasada al motor de vistas.
  • El tipo base de vistas (el nucleo de la prueba de concepto) se condiciona con ésta variable y, si existe, busca en todos los elementos del DOM con atributo role y los elimina, de manera que actualmente la variable Role no define quien tiene permisos, si no quien no los tiene:
<p role="admin">algo que solo puede ver el administrador.</p>

Hay que cambiar en la configuración de las vistas el tipo de vistas base que se usará. en nuestro caso, al sobreescribir la funcionalidad basica de renderizado de la pagina y crear la clase WebViewPageCustom tendremos el siguiente codigo en la configuración Razor.Role/Razor.Role.Web/Views/Web.config.

<pages pageBaseType="Razor.Role.Web.WebViewPageCustom, Razor.Role.Web, Version=1.0.0.0, culture=neutral,  PublicKeyToken=82178810-6aa3-48b8-b865-9a4ca1e714fb">
      <namespaces>
        <add namespace="System.Web.Mvc" />
        <add namespace="System.Web.Mvc.Ajax" />
        <add namespace="System.Web.Mvc.Html" />
        <add namespace="System.Web.Optimization"/>
        <add namespace="System.Web.Routing" />
        <add namespace="Razor.Role.Web" />
      </namespaces>
    </pages>

Tenemos los namespaces basicos que usara la pagina, si se necesitan crear helpers o acceder a clases de configuracion estaticas globales se añadirá aquí. Si configuramos el sistema de roles por clase statica global y usamos el sistema actual de ViewBag no es necesario añadir ningún namespace.

La solución usa MSHTML (vuelta a los COM) para poder navegar entre los nodos del DOM, manipularlos y renderizar en consecuencia. Aunque en éste proyecto no se usa, existe un paquete en Nuget de ésta misma libreria, no oficial.

Nota:

  • Esto solo es una prueba de concepto, es posible que se extienda para crear nueva funcionalidad o que muera en éste estado.
  • Se ha seguido la documentación de Microsoft sobre MSHTML para alcanzar el objetivo.
  • No se ha realizado ninguna prueba ni medición del rendimiento, no obstante, en el testeo, la plantilla por defecto del proyecto no aparenta ser afectada en tiempos de carga.