Frage

Ich baue eine Webapp mit rollenbasierten Zugriffskontrolle mit Acegi (Frühling) Sicherheit. Also ich habe verschiedene Benutzer mit Rollen: ROLE_ADMIN, ROLE_USER und etc.
Allerdings muss ich verschiedene Benutzer Einschränkungen implementieren.

Nehmen wir ein Beispiel betrachten:

  

Nehmen wir an, es gibt einen Ort, an dem Benutzer Filme online ansehen können. Es gibt Benutzer mit Rollen ROLE_STANDARD_USER und ROLE_VIP_USER. Standardbenutzer können drei Filme pro Woche sehen und VIP-User 10 Filme pro Woche sehen können und haben einige andere Privilegien. Und es gibt einen Benutzer in Standard-Benutzergruppe, an den ich weitere 2 Filme pro Woche geben will. Die Anzahl der erlaubten Filme können manchmal ändern.
  Auch gibt es verschiedene Kategorien von Filmen: Fantasy, Komödie, Klassiker, neue Filme und etc. Und ich möchte, dass einige Benutzer, unabhängig von ihrer Rolle, haben nur Zugriff auf bestimmte Kategorien. Die Kategorien können dynamicaly erstellt und entfernt werden.

Gibt es Standardverfahren für eine solche Art von Benutzereinschränkungen implementieren?
Kann / soll es Spring Security Rollen und Berechtigungen verwenden getan werden?
Oder muss ich prüfen, das Hinzufügen einer regelbasierten Engine meine app?

Danke.

Bearbeiten
Das obige Beispiel ist fiktiv, mein Projekt befasst sich mit Remote-Zugriff auf verschiedene Netzwerk gewähren (und andere) Ausrüstung für Studenten. Allerdings sind die Arten von Benutzern Constraints wahrscheinlich die gleichen sein.
Leider ist das Modell für den Benutzerzugriff und Einschränkungen nicht vollständig und stabil. In naher Zukunft werden könnte, sagte ich verschiedene zusätzliche Einschränkungen für die Nutzer zu implementieren, die jetzt nicht bekannt sind.
So würde Ich mag einen Weg wählen nun, dass zusätzlich oder Änderung neuer Benutzer Einschränkungen in Zukunft erleichtern wird und nicht signifikante Überarbeitung der internen Modells oder Datenbankstruktur erforderlich machen würde. Wenn das überhaupt möglich.

Edit 2

Derzeit sind grundlegende Benutzereinschränkungen fest einprogrammiert (Überbleibsel aus Prototyping-System). Ich denke, ich werde versuchen, es zuerst zu einer Art parametrisierte Business Services Refactoring-Objekte zuerst und dann denken, wo ich kann, gehen von dort aus. Ich werde auch prüfen, Spring Security Authorization Decision Manager verwenden.

Vielen Dank für alle Anregungen!

War es hilfreich?

Lösung

Ich würde nicht ein deklaratives rollenbasierte Sicherheitssystem erwartet, dass die feinkörnige Kontrolle geben, die Sie suchen. Sie haben schon ziemlich viele „Business-Regel“ basierte Zugriffssteuerung Sie implementieren möchten beschrieben und wir könnten diese Regeln im Laufe der Zeit immer komplexer erwarten. Sie müssen also eine Kombination von Informationen aus dem Sicherheitsuntersystem (die der Benutzer für diese Anforderung ist? Welche Rollen haben sie?), Aber dann programmatisch kombinieren, dass mit Geschäftsdaten und Regeln (dieser Benutzer zu 2 kostenlose Filme entitiled, wenn das heutige Datum in diesem Bereich ist).

A die allerwenigsten ich definieren würde, in denen ich die Business-Logik zu kapseln. Die Entscheidung darüber, ob ein vollwertiges Rules Engine weitere Studie müßte verwenden.

Andere Tipps

Bevor Sie sich es Acegi fragen (oder ein regel Motor etc.) ist der richtige Ort, um es zu tun, ich glaube, Sie müssen
analysieren Ihren Bedarf genau und vollständig .

Unter Berücksichtigung jedes Themas ( zum Beispiel Grenzen Film, die gesehen werden können ), gibt es eine große Anzahl von Möglichkeiten, dies zu implementieren, und Sie müssen funktionelle Entscheidungen treffen. Es kann keine korrekte Umsetzung sein, wenn Sie bereits in Einzelheiten entschieden, was zu tun ist!

Beispiel eines Modell für Ihre Bedürfnisse:

  • Beschränken Sie die Anzahl der allgemeinen Filme pro Woche nach der Summe von :
    • Rolle (3 oder 10)
    • pro Benutzer Bonus (default 0, wenn nicht erwähnt)
  • Aktualisieren Sie diese Zahlen je nach Bedarf
  • Beschränken Sie die Filme auf eine Liste von Kategorien:
    • Wenn Sie eine Liste für den Benutzer angegeben wird, verwenden Sie es
    • sonst, verwenden Sie die Liste, die für die Rolle vorgesehen ist,

Dieses Beispiel hat viele Folgen, die in Ihrem Fall richtig oder nicht akzeptabel sein können.
Auswirkungen:

  • nach einer Reihe Aktualisierung wird die Grenze sofort geändert.
  • gibt es keine Erinnerung an den wöchentlichen Grenzen, können Sie dies nicht für die Vergangenheit fragt (Statistik zum Beispiel zu machen)
  • ...

Dieses Modell Gesetzt Ihre Bedürfnisse nicht passt, Sie stehen vor der harten Arbeit ein Modell zu schaffen, das wirklich ihnen passt. Erst wenn Sie es haben, dann denken Sie über die Umsetzung.

Wenn Sie Spring Security betrachten, ist dies ein Weg, ich sehe Sie Ihre Lösung implementieren können. Implementieren Sie eine AccessDecisionVoter auf Benutzer-Zugang zu entscheiden. Werfen Sie einen Blick auf die Referenzquelle hier

Schauen Sie auch auf der [javadoc] [2] für AccessDecisionVoter. Sie können Ihre Regeln durch die Umsetzung der vote Methode implementieren.

int vote(Authentication authentication,
         Object object,
         ConfigAttributeDefinition config)

Lassen Sie Frühling den Zugriff (Authentifizierung und Autorisierung) behandeln. Wenn die Entscheidungsfindung Verwendung eine Regel-Engine könnte klug sein, kompliziert wird. Lassen Sie die Abstimmung Methode auf eine Regel-Engine rufen. Diese klare Trennung der Pflicht. Lassen Sie Spring Security den Zugriff handhaben, und lassen Sie die Regel-Engine, die Regeln berechnen.

[2]: http://static.springsource.org/spring-security/site/apidocs/org/springframework/security/vote/AccessDecisionVoter.html#vote (org.springframework.security.Authentication , java.lang.Object, org.springframework.security.ConfigAttributeDefinition)

Klingt wie Sie die Authentifizierung Bedürfnisse haben und Autorisierung muss - eine Menge Zeit Menschen, die zwei verwirrt und / oder verbunden zu bekommen. Zum Glück Spring Security umreißt die beide sehr gut. Sie sind Benutzer wird durch die Sicherheitskette authentifizieren (sei es logj, OpenID, SSL X509 bilden) und dann einmal getan mit durch Ihr Unternehmen spezifischen Abstimmungen zugelassen werden (in Ihrem AccessDecisionManagers) in Bezug auf Wetter oder nicht sie haben bereits ihre zugeteilten Nummer gesehen von Filmen. Wenn neue Geschäftslogik später hinzugefügt werden muss, es ist einfach eine Frage des Schreibens neue / mehr Wähler und sie in Ihre Manager-Injektion.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top