Während Rollenmitgliedschaftsprüfungen sind etwas von einem Anti-Muster (es ist besser, um die Erlaubnis oder Aktivität zu kodieren), werden sie häufig für Service-Level-Zugriffskontrolle verwendet (Web-Anfragen & Methodenaufrufe), aber überhaupt nicht geeignet für die Sicherung der tatsächlichen Domäne Objekte in einer Multi-Tenant-Einstellung, z um zu verhindern, dass ein Benutzer auf eine Ressource eines anderen Benutzers derselben Rolle zugreift.
Ihr Ansatz zu überprüfen, ob eine authentifizierte Anmeldung mit einem bestimmten Domänenobjekt verbunden ist, funktioniert, aber es ist umständlich, verbindet und/oder verschmutzt Ihr Anwendungsdatenmodell mit dem Sicherheitsdatenmodell, und wie Sie vermutet, ist nicht eine beste trainieren.
Sie haben bereits einige Optionen identifiziert:
Apache Shiro bietet ein konsistentes und leicht zu bedienendes API, die Domain-Objekt Zugriffskontrolle unterstützt, aber Sie sind für die Bereitstellung des Back-End „Bereichs“ verantwortlich, Das bedeutet, dass Sie möglicherweise Ihren eigenen Datenspeicher und/oder DAOs implementieren müssen.
Spring Sicherheits-ACLs ist das Zugriffskontroll-Paradigma von Spring zur Sicherung von Domänenobjekten. Es entkoppelt das Sicherheitsdatenmodell von Ihrem Anwendungsdatenmodell. Zugriffskontrolllisten erleichtern das Zuweisen oder Überprüfen von Zugriff auf Domänenobjekte durch Hinzufügen oder Nachschlagen von ACL-Einträgen. Sie müssen jedoch möglicherweise ein eigenes DAO schreiben, wenn Sie alle Domänenobjekte, auf die ein Benutzer zugreifen kann, effizient finden können Objekte in einer Liste oder um den Zugriff darauf zu widerrufen). Darüber hinaus Sie sind verantwortlich ACLs zu halten, weil:
Spring Security keine spezielle Integration bereitstellt, um automatisch zu erstellen, zu aktualisieren oder ACLs als Teil Ihrer DAO oder Repository-Operationen löschen. Stattdessen müssen Sie Code für Ihre [...] einzelnen Domänenobjekte schreiben. Es sollte in Betracht gezogen werden, AOP auf Ihrer Services-Schicht zu verwenden, um die ACL-Informationen automatisch in Ihre Services-Layer-Operationen zu integrieren.
— Spring Security 4.0 reference
Schließlich müßten Sie die ACL-Implementierung anpassen, wenn der Standard-API nicht kompatibel mit Ihrem Anwendungsmodell ist (zB wenn Sie Ihre Domain-Objekte haben keine öffentliches getId()
oder verwenden Sie keine IDs kompatibel mit long
)
Wenn Sie nicht verheiratet sind zum Frühling oder Shiro für die Bereitstellung von Domain-Objekt Zugriffskontrolle, gibt es noch eine weitere Alternative:
OACC, ein Open-Source-Java-Sicherheits-Framework (Offenlegung: Ich bin Betreuer und Co-Autor), die eine reiche API sowohl bietet erzwingen und Ihre Genehmigung Bedürfnisse zu verwalten. OACC ist ein komplettes Zugangskontroll-Framework mit einer reichhaltigen API, die keine DIY-Implementierung erfordert, um die programmatische und dynamische Modellierung feingranularer Autorisierung zu ermöglichen. Es verfügt über einen vollständig implementierten RDBMS-gestützten Datenspeicher für sein Sicherheitsmodell, den die API hinter den Kulissen für Sie verwaltet.
der OACC Sicherheitsmodell ist permission-based: Er verwaltet im Wesentlichen Berechtigungen zwischen Ressourcen.Ressourcen repräsentieren sowohl gesicherte Domänenobjekte als auch die Akteure auf ihnen (d. H. Subjekte). Es bietet auch effiziente Abfragemethoden Ressourcen nach Berechtigung zu finden, ohne alle Ressourcen zuerst zu laden und dann die nicht autorisierten herausfiltern. Diese Methoden sind in dem Sinne symmetrisch, dass Sie sowohl die Ressourcen finden können, für die eine bestimmte Ressource über bestimmte Berechtigungen verfügt, als auch die Ressourcen, die eine bestimmte Berechtigung für eine angegebene Ressource haben. Vergleichen Sie das OACC-Fragment, das gewährt werden soll unten die Erlaubnis, mit dem sample code from the Spring Security ACL reference:
// get the resource representing the principal that we want to grant permissions to
User accessorUser = Users.findByName("Samantha");
Resource accessorResource = Resources.getInstance(accessorUser.getId());
// get the resource representing the object that we want to grant permissions to
Resource accessedResource = Resources.getInstance(Foos.findById(44).getId());
// Now grant some permissions
Permission permission = ResourcePermissions.getInstance("ADMINISTER");
oacc.grantResourcePermissions(accessorResource,
accessedResource,
permission);
für die Zulassung zu überprüfen, können Sie entweder
oacc.assertResourcePermissions(accessorResource, accessedResource, permission);
rufen oder den Rückgabewert von
überprüfen 210
oacc.hasResourcePermissions(accessorResource, accessedResource, permission);
Ein weiteres neues Merkmal von OACC sind create-Berechtigungen, die nicht nur kontrollieren, welche Art von Ressourcen ein Thema erstellen kann, sondern auch genau definieren, welche Berechtigungen sie auf eine neue Ressource nach dem Erstellen es bekommen würden - Einmal definiert, werden Berechtigungen automatisch einem Ersteller von Ressourcen zugewiesen, ohne dass explizite API-Aufrufe erforderlich sind.
Zusammenfassend wurde OACC speziell mit Ihrem Anwendungsfall von authentifizierte, feinkörnige Autorisierung im Hinterkopf entwickelt.
Ich wollte dir nur für deine Antwort danken. Ich habe Oacc noch nicht gründlich untersucht. ~ Ich bin ein bisschen auf den Starter Guide gekommen ... – Hurricane
Fühlen Sie sich frei, hier eine Frage zu stellen oder auf der OACC [Mailingliste] (https://groups.google.com/) forum/#! forum/oacc-users), wenn Sie Hilfe oder Klärung benötigen – fspinnenhirn