A menudo, lo que se muestra a un usuario (por ejemplo, en una página web) se basará en parte en controles de seguridad. Por lo general, considero que la seguridad de nivel de usuario / ACL es parte de la lógica empresarial de un sistema. Si una vista verifica explícitamente la seguridad para mostrar condicionalmente elementos de la interfaz de usuario, ¿está violando MVC al contener lógica empresarial?
10
Respuestas:
Puede haber dos tipos de condicionales de seguridad, uno en el modelo y otro en la vista. La vista controla la visualización de elementos relevantes según los permisos del usuario actual, pero el modelo controla el acceso a los datos subyacentes. Mientras el modelo tenga todas las verificaciones / validaciones correctas, incluso si falta la vista, todavía hay seguridad.
Por lo general, debe tener ambos, ya que la vista debe cambiar para diferentes niveles / roles. El controlador envía los datos relevantes que cambiarían la vista, pero la vista aún necesita hacer algo con esos datos para ocultar / mostrar el contenido al usuario correcto.
Es por eso que la mayoría de los frameworks de plantillas tienen elementos condicionales ( ejemplo de Handlebars ):
Eso significa que no es una violación, siempre y cuando las piezas apropiadas estén en el lugar correcto.
fuente
Si y no.
Si la vista toma la decisión de seguridad real, entonces sí, está violando MVC. Sin embargo, si la vista delega la decisión real al modelo, entonces está bien. No hay nada de malo en una vista que toma decisiones sobre qué elementos mostrar, según la información del modelo.
Por ejemplo, si tiene un botón "editar" que solo es visible para usuarios con permisos de "editor", entonces está bien que la vista pregunte al modelo quién es el usuario actual y si tiene el permiso de "editor", entonces usando esta información para decidir si mostrar el botón o no. Sin embargo, si la vista hiciera la lógica de autenticación y autorización en sí, entonces estaría violando MVC.
fuente
Yo diría que no .
Pero por una razón diferente a la que dijo @rvcoutinho (aunque cita wikipedia que me hace sentir mal en mi pensamiento)
Diría que cualquier preocupación de seguridad relevante debería ser compartida por el Modelo dado a la vista (dependiendo de la cantidad de combinaciones que desee utilizar un ViewModel por este motivo), ya que podría tener conmutadores para los bits de seguridad.
Esto permite la validación de seguridad de dos capas: en la capa de la interfaz de usuario para que se revierta una devolución de datos para el caso normal, así como en la capa del servidor para los malos actores donde el modelo mantiene el conocimiento de seguridad dentro de sí mismo para que el controlador pase la información a el modelo que lo tira de inmediato.
La seguridad de dos capas como esta es el estándar en la industria, y de esta manera permite que su lógica de seguridad solo exista en dos lugares, por lo que es una ventaja, tan pronto como coloque la lógica de seguridad en su controlador, la pondrá allí y en el UI y en el modelo (el modelo lo necesita, ya que es la última línea de defensa y es especialmente importante para cualquier uso fuera de esa aplicación web MVC, como un cliente de escritorio o cualquier herramienta de administración del servidor)
fuente
Yo diría que no .
Por lo general, este tipo de controles de seguridad los realizará el controlador.
A partir de Wikipedia :
Y no creo que deba hacerse directamente en la vista. Si se hace a través de javascript, por ejemplo, podría ser un problema de seguridad (uno podría deshabilitar javascript y acceder a datos privilegiados).
De nuevo, de Wikipedia :
fuente
Hay varios problemas involucrados en esta pregunta.
if model.userCanEdit() ... endif
.fuente
Si solo se trata de mostrar el elemento de la interfaz de usuario, creo que está bien (¿de qué otra manera lo harías?). Si hubiera algún dato en esos elementos, el modelo debería haberse asegurado de que los contenedores estén vacíos. Y, por supuesto, el código para obtener los datos del permiso debería haberse manejado antes de la vista, por lo que no hay acceso activo al modelo aquí.
fuente
Sí, es una violación de MVC.
La vista solo está ahí para mostrar elementos, y la lógica debe estar en el modelo. Al hacer que la vista haga algo (en su caso, verifique la seguridad), está colocando la lógica allí.
fuente