2010-12-14 11 views
4

Ich entwickle eine CMS-ähnliche Anwendung mit MVC 3 (RC2) und bin an dieser Stelle an der Kreuzung. Ich bin nicht in der Lage, mich davon zu überzeugen, ob mein vorgeschlagener Ansatz angemessen ist oder nicht. Ich schätze, es liegt daran, dass ich weiß, dass ich versuche, einige Ecken zu schneiden, die mich später schwer auf der Strecke kosten werden.Anwendungslogik (Platz für Authentifizierung/Autorisierung)

Ich werde richtig runter zu beschreiben, mein Problem:

1) Ich habe eine Ressource (lässt sie A nennen), die editierbar gemacht werden muss.

2) Ich habe ein benutzerdefiniertes Berechtigungssystem implementiert, das 2 hat (von vielen) Berechtigungen:

  • Können Eigene Ressourcen bearbeiten
  • bearbeiten kann andere Ressourcen

3) Schöpfer der Ressource A ist frei, es zu bearbeiten, wenn sie die Berechtigung 'Eigene Ressource bearbeiten' haben.

4) Ein separater Benutzer kann nur A bearbeiten, wenn sie die Berechtigung ‚Can bearbeiten Andere Ressource‘

Nun, da die Anforderung beschrieben wird, lassen Sie mich Ihnen mein Ansatz sagen bisher:

1) I einen Controller 'ResourceController'

2) ich habe eine Aktion namens 'Bearbeiten'

3) Die Aktion hat ein Attribut auf sie genannt: [CustomerAuthorize (Perm.CanEditOwnResource, Perm.CanEditOtherResource, Alle = true) ]

4) Ich habe eine Serviceklasse, die sich um die Domain-Validierung kümmert.

So kann ein Benutzer die Aktionsmethode aufrufen, wenn er entweder die Berechtigung 'Eigene Ressource bearbeiten' oder 'Kann andere Ressource bearbeiten' besitzt.

Wie kann ich entscheiden (und wo sollte diese Entscheidung getroffen werden), ob der Benutzer die richtige Berechtigung hat oder nicht (abhängig davon, ob sie die Ressource besitzt?) Sollte es in der Controller-Aktion in der Ressourcendienstklasse sein , in einer separaten Serviceklasse?

Warten unterschiedliche Ansichten zu hören ...

Antwort

2

Aufgrund der Natur von MVC werden Sie Ihre Authentifizierungsüberprüfungen an einer Vielzahl von Punkten benötigen.

Zum einen müssen Sie in der Lage sein, visuelle Hinweise auf der Benutzeroberfläche anzuzeigen (z. B. die Bearbeitungsschaltfläche anzuzeigen oder nicht anzuzeigen), sodass die Logik Ihren Ansichten zur Verfügung gestellt werden muss.

Natürlich ist das nur für UI-Zwecke. Sie benötigen auch eine Authentifizierung/Autorisierung für Ihre Controller-Aktionen, nur für den Fall, dass jemand Ihre Benutzeroberfläche aufruft, um darauf zuzugreifen.

Schließlich ist der sicherste Ort, um eine Aktion zu authentifizieren und zu autorisieren, bevor Sie es ausführen. Wenn Sie zum Beispiel einen Handler haben, würde ich dort eine Autorisierungslogik platzieren. Sie möchten sicherstellen, dass niemand Ihre Sicherheitslogik umschreiben kann, indem er den Dienst von einem anderen Ort aus aufruft und nicht weiß, dass es Beschränkungen für diesen Dienst gibt. Dies trägt dazu bei, die Sicherheitsoptionen präziser zu machen.

+0

Aber ist das doppelte Logik? Haben die gleichen Prüfungen mehrmals wiederholt? Aber ich verstehe deine Sorge. Ich frage mich, ob ich einige OSS-Projekte sehen könnte, um das Muster zu lernen. – kidoman

+0

@ KiD0M4N: Es gibt einige Szenarien, in denen das Wiederholen einiger Logik viel einfacher ist (einschließlich langfristiger Wartungsüberlegungen), als es nicht zu wiederholen. Das heißt, manchmal machen es technische Einschränkungen oder bestehende Designentscheidungen unzumutbar schwierig, sich reinrassig zu machen und sich nicht selbst zu wiederholen. –

0

Eine Möglichkeit, sich ihr zu nähern ist 2 Aktionen zu haben, sondern nur auf „Bearbeiten“, Sie „EditOwnResource“ und „EditOtherResource“ haben. Sie können dann eine einzelne Erlaubnis für jede von diesen setzen.

Wenn Sie dann das MVVM-Muster verwenden, können Sie die Verfügbarkeit dieser Aktionen so festlegen, dass es sich um eine eigeneRessource oder eine andereRessource handelt. Die Einstellung dieser Werte erfolgt im View-Modell.

+0

Ich benutze ASP.NET MVC. Daher gelten die MVVM-Bits nicht. Aber ich werde über zwei getrennte Frontaktionen nachdenken. Aber es wird wahrscheinlich nicht in meinem speziellen Fall möglich sein – kidoman