Ist die Verwendung von Sicherheitsbedingungen in einer Ansicht eine Verletzung von MVC?

10

Oft basiert das, was einem Benutzer angezeigt wird (z. B. auf einer Webseite), teilweise auf Sicherheitsüberprüfungen. Normalerweise betrachte ich die Sicherheit auf Benutzerebene / ACL als Teil der Geschäftslogik eines Systems. Wenn eine Ansicht die Sicherheit explizit überprüft, um UI-Elemente bedingt anzuzeigen, verstößt sie dann gegen MVC, indem sie Geschäftslogik enthält?

Matt S.
quelle
Was wäre die Alternative?
1
Sie verwenden das, was Ihnen die beste Sicherheit bietet, auch wenn es von einigen als Anti-Pattern angesehen wird.
zxcdw

Antworten:

6

Es kann zwei Arten von Sicherheitsbedingungen geben, eine für das Modell und eine für die Ansicht. Die Ansicht steuert die Anzeige relevanter Elemente in Abhängigkeit von den Berechtigungen des aktuellen Benutzers, das Modell steuert jedoch den Zugriff auf die zugrunde liegenden Daten. Solange das Modell über die richtigen Überprüfungen / Validierungen verfügt, besteht auch dann noch Sicherheit, wenn die Ansicht fehlt.

Normalerweise müssen Sie beide haben, da sich die Ansicht für verschiedene Ebenen / Rollen ändern muss. Der Controller sendet die relevanten Daten, die die Ansicht ändern würden, aber die Ansicht muss noch etwas mit diesen Daten tun, um Inhalte für den richtigen Benutzer auszublenden / anzuzeigen.

Aus diesem Grund verfügen die meisten Vorlagen-Frameworks über bedingte Elemente ( Beispiel für Lenker ):

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

Das bedeutet also, dass es keine Verletzung ist, solange sich die entsprechenden Teile an der richtigen Stelle befinden.

bekanntasilya
quelle
4

Ja und nein.

Wenn die eigentliche Sicherheitsentscheidung von der Ansicht getroffen wird, verstoßen Sie gegen MVC. Wenn die Ansicht jedoch die eigentliche Entscheidung an das Modell delegiert, ist alles in Ordnung. Es ist nichts Falsches daran, Entscheidungen zu treffen, welche Elemente basierend auf Informationen aus dem Modell angezeigt werden sollen.

Wenn Sie beispielsweise über eine Schaltfläche "Bearbeiten" verfügen, die nur für Benutzer mit Berechtigungen "Editor" sichtbar ist, kann die Ansicht das Modell fragen, wer der aktuelle Benutzer ist und ob sie über die Berechtigung "Editor" verfügen Verwenden Sie diese Informationen, um zu entscheiden, ob die Schaltfläche angezeigt werden soll oder nicht. Wenn die Ansicht jedoch die Authentifizierungs- und Autorisierungslogik selbst ausführen würde, würden Sie MVC verletzen.

tdammers
quelle
2

Ich würde nein sagen .

Aber aus einem anderen Grund als @rvcoutinho sagte (obwohl er Wikipedia zitiert, was mich in meinem Denken falsch fühlen lässt)

Ich würde sagen, dass alle relevanten Sicherheitsbedenken von dem Modell geteilt werden sollten, das der Ansicht zugewiesen wurde (abhängig von der Anzahl der Kombinationen, die Sie aus diesem Grund möglicherweise für ein ViewModel verwenden möchten), da Sie möglicherweise Schalter für die Sicherheitsbits haben könnten.

Dies ermöglicht die Sicherheitsüberprüfung auf zwei Ebenen: Auf der UI-Ebene wird ein Postback für den Normalfall untergraben, sowie auf der Serverebene für schlechte Akteure, bei denen das Modell das Sicherheitswissen in sich behält, sodass der Controller die Informationen an weitergibt das Modell, das es sofort rauswirft.

Zweischichtige Sicherheit wie diese ist der Standard in der Industrie, und auf diese Weise muss Ihre Sicherheitslogik nur an zwei Stellen vorhanden sein. Dies ist ein Bonus, sobald Sie die Sicherheitslogik in Ihren Controller einfügen, platzieren Sie sie dort und in der Benutzeroberfläche und im Modell (das Modell benötigt es, da es die letzte Verteidigungslinie darstellt und besonders wichtig für alle Anwendungen außerhalb dieser MVC-Web-App wie einen Desktop-Client oder Serververwaltungstools ist).

Jimmy Hoffa
quelle
Die Behauptung von Wikipedia, dass "ein Controller Befehle an die zugehörige Ansicht senden kann, um die Darstellung des Modells in der Ansicht zu ändern", scheint für Model-View-Presenter passender zu sein , da das interaktive Modell, das der Ausdruck zu beschreiben scheint, dort möglich ist, während dies in MVC einmal möglich ist Wenn die Ansicht gerendert wird, findet keine weitere Aktion zwischen der Ansicht und dem Controller statt.
Robert Harvey
1
@RobertHarvey Ich würde zustimmen, dass diese Aussage nicht in meine Definition von MVC passt, aber zum Glück arbeiten wir in einer Branche, in der die Richtigkeit eher durch eine Vielzahl von Vereinbarungen als durch eine Beweisbarkeit entschieden wird, da diese Definitionen einfach wie aus dem Äther mit schweben Eine sich ständig weiterentwickelnde Grundlage, auf der jeder seine eigenen Imbissbuden herstellen kann. Oder einfacher gesagt, ich liege wahrscheinlich genauso falsch wie alle anderen hier.
Jimmy Hoffa
3
Aus diesem Grund denke ich, dass die Leute sowieso viel zu pedantisch sind.
Robert Harvey
1
@rvcoutinho Ich würde nicht sagen, dass ich buchstäblich war; Sie haben Referenzen auf Ihrer Seite, alles was ich habe ist meine Meinung. In meinen Augen bedeutet das, dass ich wahrscheinlich falsch liege, weshalb ich es erwähnt habe. Ich halte meine Meinung für plausibel genug, um sie zu teilen, obwohl ich keine Referenzen habe, also habe ich es trotzdem getan, ungeachtet der Tatsache, dass ich, wie gesagt, wahrscheinlich falsch liege.
Jimmy Hoffa
1
@rvcoutinho: Eigentlich habe ich mich auf die Frage des OP bezogen. :) An Regeln ist nichts auszusetzen, es sei denn, die Regeln behindern die Erledigung von Aufgaben.
Robert Harvey
2

Ich würde nein sagen .

Normalerweise wird diese Art von Sicherheitsüberprüfungen vom Controller durchgeführt.

Wie aus Wikipedia :

Ein Controller kann Befehle an die zugehörige Ansicht senden, um die Darstellung des Modells in der Ansicht zu ändern

Und ich denke nicht, dass es direkt in der Ansicht gemacht werden sollte. Wenn dies beispielsweise über Javascript erfolgt, kann dies ein Sicherheitsproblem darstellen (man kann Javascript deaktivieren und auf privilegierte Daten zugreifen).

Wieder aus Wikipedia :

Eine Ansicht fordert vom Modell die Informationen an, die zum Generieren einer Ausgabedarstellung erforderlich sind .

rvcoutinho
quelle
1
In vielen Softwaresystemen hängt die Anzeige eines Elements von der Sicherheitsstufe eines Benutzers ab. Während Sie die Anzeige eines Datenelements sperren können, indem Sie es im Ansichtsmodell auf Null oder Null setzen, wird der Name oder die Beschreibung des Datenelements weiterhin angezeigt. Der einzige Ort, an dem Sie die Anzeige der Datenelementbeschreibung (auf praktische Weise) sperren können, ist die Ansicht.
Robert Harvey
Ich bin eher anderer Meinung. Ich würde sagen, die Ansicht würde die Daten anfordern, der Controller würde das Modell manipulieren und die Ansicht würde es wieder darstellen. Die Ansicht sollte nur für die Darstellung der Ausgabe verantwortlich sein.
rvcoutinho
Aus diesem Grund muss die Ansicht die visuellen Elemente ausblenden, die der Benutzer nicht sehen muss. Der Controller ist nicht für die Erstellung der visuellen Darstellung der Daten verantwortlich. Die Ansicht ist. Wenn das, was Sie anzeigen, so empfindlich ist, dass es nicht einmal in der Ansicht / Quelle enthalten sein kann, muss der Controller natürlich eine andere Ansicht zurückgeben.
Robert Harvey
1
Das ist mein Punkt. Die Ansicht sollte anders sein. Soweit ich weiß, sollte sich die Ansicht anscheinend nur um die Darstellung der Daten kümmern. Mit Repräsentation würde ich meinen, wie man etwas zeigt, nicht wann man es zeigt. Ihre Kommentare sind jedoch absolut relevant.
rvcoutinho
Nun, ich denke, wir verwenden möglicherweise denselben Ausdruck für zwei verschiedene Dinge. Was ist überhaupt eine andere Ansicht? Aber ich denke, wir sind uns in der wichtigsten Sache einig: Wenn es sicherheitsrelevant ist, sollte es nicht von der Ansicht behandelt werden.
rvcoutinho
1

Mit dieser Frage sind mehrere Probleme verbunden.

  1. Die Authentifizierung (ist dieser Benutzer, von dem er sagt, dass er er ist) sollte kein Problem der Ansicht sein.
  2. Die Autorisierung (Darf der aktuelle Benutzer dies tun ) ist ein Problem der Ansicht, da sie sich auf das auswirken kann, was dem Benutzer angezeigt wird. Somit kann der Code zum Anzeigen einer Bearbeitungsschaltfläche von einem bedingten Like umgeben sein if model.userCanEdit() ... endif.
  3. Die Bestimmung, welche Berechtigungsattribute ein Benutzer hat, dh Geschäftslogik, sollte im Modell platziert werden. (Zum Beispiel, dass Sie für das Privileg "Bearbeiten" einen Ruf von 2000 haben müssen oder dass Sie der Autor oder Moderator sein müssen.)
Bart van Ingen Schenau
quelle
0

Wenn es nur darum geht, das UI-Element anzuzeigen, denke ich, ist es in Ordnung (wie würden Sie es sonst noch tun?). Wenn diese Elemente Daten enthalten würden, hätte das Modell sicherstellen müssen, dass die Container leer sind. Und natürlich sollte der Code zum Abrufen der Berechtigungsdaten vor der Ansicht verarbeitet worden sein, sodass hier kein aktiver Zugriff auf das Modell besteht.

thorsten müller
quelle
0

Wenn eine Ansicht die Sicherheit explizit überprüft, um UI-Elemente bedingt anzuzeigen, verstößt sie dann gegen MVC, indem sie Geschäftslogik enthält?

Ja, es ist eine Verletzung von MVC.

Die Ansicht dient nur zur Anzeige von Elementen, und die Logik sollte sich im Modell befinden. Indem Sie die Ansicht etwas tun lassen (in Ihrem Fall die Sicherheit überprüfen), platzieren Sie die Logik dort.

BЈовић
quelle
Wie würde die Ansicht dann wissen, ob so etwas wie eine Bearbeitungsschaltfläche angezeigt werden soll oder nicht?
Matt S
@MattS Der Präsentator ruft eine Funktion in der Ansicht auf, um diese Schaltfläche anzuzeigen oder auszublenden (abhängig von einem Status im Modell).
BЈовић