2016-03-04 3 views
5

Wir haben eine Federmvc-Ruhepi, die Federsicherheit und Ruhezustand zu einer MySql-Datenbank.Best Practice, um sicherzustellen, dass ein authentifizierter Benutzer berechtigt ist, auf eine Ressource zuzugreifen - Spring mvc, Spring Security, Hibernate

Wir haben einige Rollen konfiguriert. Zum Beispiel:

Standardbenutzer: ROLEA

Superuser: roleb

Zeit, um sicherzustellen, dass ein Benutzer authentifiziert zugangsberechtigt ist/eine bestimmte Ressource aktualisieren wir etwas tun wie folgt:

Identifizieren Sie den aktuellen authentifizierten Benutzer:

Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); 
String activeLogin = authentication.getName(); 

die Login identifiziert sich mit dem Unternehmen assoziiert sie zugreifen mögen:

String loginAssociatedToRequestedEntity = fooService.getEntityA(EntityAId).getEntityB().getEntityC().getLogin(); 

die Benutzer Vergleich mit bestimmten Ressource Both verbunden:

if (!loginAssociatedToRequestedEntity.equals(activeLogin)) { 
throw new ForbiddenAccessException(); 
} 

Ich habe eine Reihe von Fragen Dazu gehören einige davon:

  • Sehr verschwenderisch ... jeder Entität müsste hydratisiert/bevölkert sein. Dies könnte sogar noch schlimmer als im obigen Beispiel sein, wenn die Entität, auf die zugegriffen werden soll, weiter von der Tabelle mit den Login-Namen entfernt ist.
  • Scheint wie ein Code-Geruch (Demeter-Gesetz).
  • Eine Anfrage kann kommen, die mehrere Entitäten aktualisieren könnte. Eine ähnliche Überprüfung wie oben muss möglicherweise wiederholt werden.

ich in Betracht gezogen wurden folgende als mögliche Optionen:

Spring ACLs

Apache shiro

Also meine Frage ist, gibt es eine bewährte Methode, dass ein authentifiziert zu machen Benutzer autorisierte, um auf eine bestimmte Ressource zuzugreifen, dh sie davon abzuhalten, auf eine Ressource eines anderen Benutzers in derselben Rolle zuzugreifen.

Wenn Sie auf ein konkretes Beispiel (Github) hinweisen könnten, das würde sehr geschätzt werden.

TIA.

Antwort

7

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.

+0

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

+0

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

0

Mithilfe von Spring Data JPA können Sie die Spring Security-Principalinformationen zu Ihren SQL-Abfragen hinzufügen. Beispiel:

https://github.com/spring-projects/spring-data-examples/blob/master/jpa/security/src/main/java/example/springdata/jpa/security/SecureBusinessObjectRepository.java

Sie auch eine Datenbank wie PostgreSQL 9 nutzen könnten.5, Oracle VPD oder SQL Server 2016 mit Row Security

+0

Dank Neil, wir verwenden derzeit keine Spring Data, aber das ist etwas, was ich in Betracht ziehen werde, wenn wir uns in Zukunft anpassen. – Hurricane

Verwandte Themen