¿La mejor manera de ocultar / deshabilitar los elementos de la GUI según los privilegios del usuario?

Estoy iniciando una aplicación web con el lado del cliente implementado en ExtJS puro y nivel medio en Grails. La aplicación tiene autorización basada en roles, donde un usuario puede tener muchos roles específicos como SOME_FORM_READ, SOME_FORM_UPDATE, SOME_DATA_DELETE, SOME_DATA_READ, etc. Según los roles del usuario, ciertos elementos de la GUI deben estar deshabilitados u ocultos, mientras que otros necesitan estar en modo de solo lectura.

Hice algunas búsquedas en la web, pero no encontré ningún patrón de diseño que aborde específicamente este problema, así que se me ocurrió mi propio diseño. Estoy seguro de que muchas de las aplicaciones web tendrán un requisito similar, por lo que me gustaría publicar mi diseño aquí y escuchar la opinión de la gente al respecto. De ninguna manera mi diseño es perfecto, pero espero que pueda mejorarse con el aporte de todos. Aunque estoy trabajando con ExtJS, el diseño general también debería aplicarse a marcos similares como GWT, Flex, Swing, etc.

Entonces, aquí va:

Hay cuatro tipos de código (o información) con los que debemos tratar en el nivel de cliente con respecto a la autorización:

ódigo de manipulación de elementos @GUI, por ejemplo:

panel.hide () form.setReadOnly (true)

equisito de permiso del elemento @GUI, por ejemplo:

form.requires ('READ', 'FORM_READ_ROLE')

adminPanel.requires ('ADMIN_ROLE')

Información de privilegios de usuario, que es básicamente una lista de roles que tiene el usuario;

Lógica de autorización: determina qué elementos ocultar / deshabilitar según el privilegio del usuario;

El núcleo del diseño es un singleton, llamado GUIPermissionManager, o GPM para abreviar. Este es un diseño centralizado en el sentido de que la mayor parte del código está en GPM, por lo que los elementos de la GUI no están contaminados por el código de autorización. Así es como funciona GPM:

os elementos @GUI (que necesitan cierto permiso para acceder) registran su información de permiso con GPM, de esta manera:

GPM.register (esto, 'DEPARTMENT_DELETE_ROLE'); // botón para eliminar un departamento

GPM mantiene una lista de registro de permisos de GUI

En el inicio de sesión del usuario, GPM recibe la lista de roles que se le asigna el uso

GPM recorre la lista de registro de permisos de la GUI y, según los privilegios del usuario, determina qué parte de la GUI se debe ocultar y, a su vez, llama a element.hide () en consecuencia

Preguntas:

os elementos @GUI están organizados en una jerarquía de árbol, p. un panel contiene una barra de botones y un formulario, por lo que cuando el panel está oculto, no hay necesidad de verificar si la barra de botones y el formulario deben estar ocultos. @Problem: ¿cómo registrar y mantener esta información jerárquica en GPM?Actualmente, solo puedo pensar en dos casos de uso para el elemento GUI: ocultar un elemento o establecer un elemento como de solo lectura (como un formulario). ¿Hay otros casos de uso?En ExtJS, para ocultar un elemento, llamamos hide (), pero para configurar un formulario de solo lectura, tenemos que crear nuestra propia función, digamos que se llama setReadOnly (), cómo hacer que GPM sepa qué función ¿llamada? ¿Pasando la función como parte del registro? ¿Cuál es la mejor manera de configurar un formulario de solo lectura? Si extiendo el componente de formulario con la funcionalidad setReadOnly (), habrá una gran cantidad de duplicación de código y tengo que hacer esto para cada formulario que necesite control de permisos. ¿Es posible crear un transformador de formulario dinámico en GPM para que si un formulario se establece en solo lectura, reemplaza automáticamente todos los campos editables con campos de solo visualización?

Respuestas a la pregunta(2)

Su respuesta a la pregunta