¿Es el uso de condicionales de seguridad en una vista una violación de MVC?

10

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?

Matt S
fuente
¿Cuál sería la alternativa?
1
Usas lo que te brinda la mejor seguridad, incluso si algunos lo consideran un antipatrón .
zxcdw

Respuestas:

6

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 ):

{{#if isCurrentUserAdmin}}
    ....
{{/if}

Eso significa que no es una violación, siempre y cuando las piezas apropiadas estén en el lugar correcto.

conocidaasilya
fuente
4

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.

tdammers
fuente
2

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)

Jimmy Hoffa
fuente
La afirmación de Wikipedia de que "un controlador puede enviar comandos a su vista asociada para cambiar la presentación de la vista del modelo" parece más adecuada para Model-View-Presenter , ya que el modelo interactivo que la frase parece describir es posible allí, mientras que en MVC, una vez se visualiza la vista, no se realiza ninguna otra acción entre la vista y el controlador.
Robert Harvey
1
@RobertHarvey Estoy de acuerdo con que la declaración no encaja en mi definición de MVC, pero por suerte trabajamos en una industria donde la corrección se decide por una pluralidad de acuerdos en lugar de cualquier posibilidad de prueba porque estas definiciones simplemente flotan como si vinieran del éter con Una base en constante evolución que permite a todos hacer sus propias conclusiones. O en palabras más simples, probablemente estoy tan equivocado como todos los demás aquí.
Jimmy Hoffa
3
Es por eso que creo que la gente es demasiado pedante sobre este tipo de cosas de todos modos.
Robert Harvey
1
@rvcoutinho No diría que, en absoluto, estaba siendo literal; tienes referencias de tu lado, todo lo que tengo es mi opinión, así que en mi opinión eso significa que probablemente estoy equivocado, por eso lo mencioné. Siento que mi opinión es lo suficientemente plausible como para que valga la pena compartirla, aunque no tengo referencias, así que lo hice de todos modos, independientemente del hecho de que, como dije, probablemente estoy equivocado.
Jimmy Hoffa
1
@rvcoutinho: En realidad, me refería a la pregunta del OP. :) No hay nada malo con las reglas, a menos que las reglas se interpongan en el camino para hacer algo.
Robert Harvey
2

Yo diría que no .

Por lo general, este tipo de controles de seguridad los realizará el controlador.

A partir de Wikipedia :

Un controlador puede enviar comandos a su vista asociada para cambiar la presentación de la vista del modelo

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 :

Una vista solicita al modelo la información que necesita para generar una representación de salida .

rvcoutinho
fuente
1
En muchos sistemas de software, la visualización de un elemento depende del nivel de seguridad de un usuario. Si bien puede inhibir la visualización de un elemento de datos al establecerlo en cero o nulo en el Modelo de visualización, el nombre o la descripción del elemento de datos aún se mostrarán. El único lugar donde puede inhibir la visualización de la descripción del elemento de datos (de manera práctica) es en la Vista.
Robert Harvey
Tiendo a estar en desacuerdo. Diría que la vista solicitará los datos, el controlador manipulará el modelo y la vista, nuevamente, lo representará. La vista solo debe ser responsable de la representación de la salida.
rvcoutinho
Es por eso que la Vista necesita ocultar esos elementos visuales que el usuario no necesita ver. El controlador no es responsable de crear la representación visual de los datos; La vista es. Por supuesto, si lo que está mostrando es tan sensible que ni siquiera puede estar en la Vista / Fuente, entonces lo que el controlador debe hacer es devolver una vista diferente .
Robert Harvey
1
Ese es mi punto. La vista debería ser diferente. Según tengo entendido, parece que la vista solo debería ocuparse de la representación de los datos. Por representación, quiero decir cómo mostrar algo, no cuándo mostrarlo. Sin embargo, sus comentarios son totalmente relevantes.
rvcoutinho
Bueno, creo que podríamos estar usando la misma expresión para dos cosas diferentes. ¿Qué es una vista diferente de todos modos? Pero creo que estamos de acuerdo en el asunto más importante: si es sensible a la seguridad, no debería ser manejado por la vista.
rvcoutinho
1

Hay varios problemas involucrados en esta pregunta.

  1. La autenticación (es este usuario quien dice que es) no debería ser una preocupación de la Vista.
  2. La autorización (si el usuario actual puede hacer esto ) es una preocupación de la Vista, ya que puede afectar lo que se le presenta al usuario. Por lo tanto, el código para mostrar un botón de edición puede estar rodeado de un condicional como if model.userCanEdit() ... endif.
  3. La determinación de qué atributos de autorización tiene un usuario, es lógica de negocio y debe colocarse en el Modelo. (Por ejemplo, el privilegio 'editar' requiere que tengas 2000 reputación; o que debes ser el autor o un moderador)
Bart van Ingen Schenau
fuente
0

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í.

Thorsten Müller
fuente
0

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?

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í.

BЈовић
fuente
Entonces, ¿cómo sabría la vista si mostrar o no algo así como un botón de edición?
Matt S
@MattS El presentador llama a una función en la vista para mostrar u ocultar ese botón (según el estado del modelo).
B 16овић