Souvent, ce qui est affiché à un utilisateur (par exemple sur une page Web) sera basé en partie sur des contrôles de sécurité. Je considère généralement que la sécurité au niveau utilisateur / ACL fait partie de la logique métier d'un système. Si une vue vérifie explicitement la sécurité pour afficher conditionnellement des éléments d'interface utilisateur, viole-t-elle MVC en contenant la logique métier?
10
Réponses:
Il peut y avoir deux types de conditions de sécurité, l'une sur le modèle et l'autre sur la vue. La vue contrôle l'affichage des éléments pertinents en fonction des autorisations de l'utilisateur actuel, mais le modèle contrôle l'accès aux données sous-jacentes. Tant que le modèle possède toutes les bonnes vérifications / validations, même si la vue fait défaut, il y a toujours de la sécurité.
Habituellement, vous devez avoir les deux, car la vue doit changer pour différents niveaux / rôles. Le contrôleur envoie les données pertinentes qui changeraient la vue, mais la vue doit encore faire quelque chose avec ces données pour masquer / afficher le contenu au bon utilisateur.
C'est pourquoi la plupart des frameworks de modèles ont des éléments conditionnels ( exemple de guidon ):
Cela signifie donc que ce n'est pas une violation, tant que les pièces appropriées sont au bon endroit.
la source
Oui et non.
Si la décision de sécurité réelle est prise par la vue, alors oui, vous violez MVC. Si, cependant, la vue délègue la décision réelle au modèle, alors tout va bien. Il n'y a rien de mal à ce qu'une vue prenne des décisions sur les éléments à afficher, sur la base des informations du modèle.
Par exemple, si vous disposez d'un bouton "modifier" qui n'est visible que pour les utilisateurs disposant des autorisations "éditeur", la vue peut demander au modèle qui est l'utilisateur actuel et s'il dispose de l'autorisation "éditeur", puis utiliser ces informations pour décider d'afficher ou non le bouton. Si, cependant, la vue devait faire la logique d'authentification et d'autorisation elle-même, vous violeriez MVC.
la source
Je dirais non .
Mais pour une raison différente de celle de @rvcoutinho (bien qu'il cite wikipedia qui me fait me sentir mal dans ma pensée)
Je dirais que tout problème de sécurité pertinent devrait être partagé par le modèle donné à la vue (en fonction du nombre de combinaisons que vous souhaiterez peut-être utiliser un ViewModel pour cette raison), en ce sens que vous pourriez avoir des commutateurs pour les bits de sécurité.
Cela permet la validation de la sécurité à deux couches: au niveau de la couche d'interface utilisateur, donc une publication est subvertie pour le cas normal, ainsi qu'au niveau du serveur pour les mauvais acteurs où le modèle conserve les connaissances en matière de sécurité à l'intérieur de lui-même afin que le contrôleur transmette les informations à le modèle qui le jette immédiatement.
La sécurité à deux couches comme celle-ci est la norme dans l'industrie, et de cette façon, votre logique de sécurité ne doit exister qu'à deux endroits, c'est donc un bonus, dès que vous placez une logique de sécurité dans votre contrôleur, vous la mettez là, et dans le Interface utilisateur et dans le modèle (le modèle en a besoin car c'est la dernière ligne de défense et particulièrement important pour toute utilisation en dehors de cette application Web MVC comme un client de bureau ou tout outil de gestion de serveur)
la source
Je dirais non .
Habituellement, ce type de contrôle de sécurité sera effectué par le contrôleur.
Comme sur Wikipedia :
Et je ne pense pas que cela devrait être fait directement dans la vue. Si cela se fait via javascript, par exemple, cela pourrait être un problème de sécurité (on pourrait désactiver javascript et accéder aux données privilégiées).
Encore une fois, à partir de Wikipedia :
la source
Il y a plusieurs problèmes impliqués dans cette question.
if model.userCanEdit() ... endif
.la source
S'il ne s'agit que d'afficher l'élément d'interface utilisateur, je pense que c'est ok (comment le feriez-vous de toute façon?). S'il y avait des données dans ces éléments, le modèle aurait dû s'assurer que les conteneurs sont vides. Et bien sûr, le code pour obtenir les données d'autorisation aurait dû être traité avant la vue, il n'y a donc pas d'accès actif au modèle ici.
la source
Oui, c'est une violation de MVC.
La vue n'est là que pour afficher les éléments, et la logique doit être dans le modèle. En faisant faire quelque chose à la vue (dans votre cas, vérifiez la sécurité), vous y placez la logique.
la source