2014-10-24 6 views
11

Spring Security ACL sieht sehr mächtig aus und ist einfach zu implementieren, wenn Sie bei ihrer Datenbankimplementierung bleiben können. Es scheint jedoch sehr viel komplizierter zu werden, wenn Sie Ihre eigenen Acl und AclService implementieren müssen (siehe zum Beispiel (very basic tutorial von nur ~ 26 Seiten)) und es scheint schwierig, Referenzen und Beispiele dafür zu finden (das Tutorial war von 2008).Wann sollte ich Spring Security ACL in meiner Anwendung implementieren?

In unserer Anwendung zum Beispiel haben Benutzer Rollen und gehören zu Abteilungen. Meistens dürfen sie einige Operationen an Objekten ausführen, die zu ihrer Abteilung gehören, basierend auf ihren Rollen. In allen Fällen reicht Abteilung + Rolle aus, um zu entscheiden, ob einem Benutzer eine bestimmte Operation für ein bestimmtes Objekt erteilt werden soll.

Benutzer, Rollen und Abteilungen werden von einer externen Anwendung verwaltet, von der wir sie abrufen, wenn der Benutzer eine Verbindung herstellt (wir verwenden REST-Dienste, aber es könnte auch ein LDAP-Server sein).

Wir würden gerne auf @PreAuthorize('hasPermission(…)') für die Implementierung von Domänenobjekt Sicherheit verlassen. 2 Lösungen sind also in Sicht:

  1. Implementieren Sie eine benutzerdefinierte PermissionEvaluator, die die gesamte Überprüfung durchführt; oder
  2. Implementieren Sie ACL mit einer benutzerdefinierten AclService, die die Objektstruktur erstellt, die für ACL ordnungsgemäß funktioniert.

Es scheint, dass die ganze AclService Umsetzung wäre schwieriger und komplexer als eine PermissionEvaluator Umsetzung, aber ACL scheinen Standard.

Nach welchen Kriterien sollten Sie das eine oder das andere implementieren?

Antwort

13

Die PermissionEvaluator ist verantwortlich für die Auswertung von Ausdrücken, um festzustellen, ob ein Benutzer eine Berechtigung für ein bestimmtes Domänenobjekt besitzt. Auf der anderen Seite bietet die AclService eine Schnittstelle zum Abruf von Acl Instanzen. Im Sinne von Separation of concerns adressiert jede Komponente ein separates Anliegen.

Wenn eine PermissionEvaluator Implementierung eine Auswertung basierend auf Acl Instanzen durchführen muss, sollte sie an AclService delegieren, um sie abzurufen. Eigentlich macht AclPermissionEvaluator genau das.

Ich würde vorschlagen, dass Sie diesen Weg gehen. Separate Auswertung von ACL-Abruf Wenn das Konzept von Spring AclService und Acl für Ihren Anwendungsfall zu kompliziert oder komplex ist, können Sie Ihren eigenen Service zum Abrufen benutzerdefinierter ACLs einführen. Implementieren Sie dann PermissionEvaluator, das an Ihren ACL-Dienst delegiert wird.

Eigentlich musste ich etwas Ähnliches machen, weil ich ACLs in der NoSQL-Datenbank speichern musste und was Spring bietet, funktionierte nicht für mich.

Ich würde sagen, dass es alles um den Aufwand geht, der erforderlich ist, um Spring ACL an Ihre Anforderungen und den Aufwand anzupassen, eine benutzerdefinierte Lösung zu implementieren. Wenn Ihre Anforderungen mit der Standard-Spring-ACL-Implementierung erfüllt werden können, gehen Sie dafür vor. Es wird Ihnen definitiv Zeit sparen, um Ihre benutzerdefinierte Lösung zu implementieren. Wenn es jedoch nicht möglich ist, Spring ACL an Ihre Anforderungen anzupassen oder dies zu schwierig wäre, kann es einfacher sein, Ihre benutzerdefinierte Lösung zu implementieren.

+1

Danke für Ihre Antwort.Eigentlich war meine Frage mehr in dem Sinne: wann macht es Sinn und wann lohnt es sich, die Sicherheitsimplementierung Ihrer Anwendung in Spring Security ACL zu integrieren? –

+0

Siehe die aktualisierte Antwort. Hoffentlich wird es helfen. – pgiecek