Warum müssen wir in der realen Welt Sicherheit auf Methodenebene implementieren?
Wir haben entweder eine Webanwendung oder eine Desktopanwendung, bei der der Benutzer auf die Benutzeroberfläche zugreift (und daher nicht direkt auf die Methode zugreifen kann).
Wo kommt hier der direkte Zugriff auf Methoden ins Bild?
Bearbeiten: Ich stelle diese Frage, weil ich mit Spring-Sicherheit experimentiere und Benutzer zum Zugriff auf Methoden autorisiere.
etwas wie :
@ROLE_ADMIN
public void update() {
//update
}
Antworten:
In einer richtig gestalteten Anwendung sind das Backend und das Frontend nicht verbunden. Das Backend-Sicherheitssystem kann nicht davon ausgehen, dass ein bestimmtes Frontend die Sicherheit korrekt handhabt, und muss sie daher selbst handhaben.
quelle
Ich gehe davon aus, dass Sie über den rollenbasierten Zugriff auf Aktionen in einem Controller sprechen. Dh in einer MVC-Architektur ist jede Methode in einer
Controller
Klasse eine separate Aktion. Bei den meisten von mir verwendeten MVC-Frameworks kann ich Berechtigungen sowohl auf Methoden- als auch auf Klassenebene zuweisen. Das würde bedeuten, dass ich ein Attribut / eine Anmerkung auf Klassenebene anwenden kann und die entsprechende Rolle für jede Aktion in diesem Controller erforderlich wäre.Beachten Sie im Hinblick auf eine differenziertere Steuerung des rollenbasierten Zugriffs Folgendes:
Als Ruby on Rails vor einigen Jahren auf Sendung ging, kopierte fast jedes MVC-Framework seinen grundlegenden Designansatz. Früher waren Aktionen separate Klassen, aber die Aktionslogik ist in der Regel klein und fokussiert, sodass ein vollständiger Klassen-Overhead übertrieben ist. Das Zuordnen einer Methode auf einem Controller zu der Aktion für eine Seite ergab tatsächlich einen großen Sinn. Wissen Sie nur, dass viele Menschen eine genaue Kontrolle darüber benötigen, welche Rollen welche Funktionen ausführen können.
quelle
Sicherheit auf Methodenebene ist aus zwei Hauptgründen nützlich:
als weitere Sicherheitsebene (zusätzlich zu anderen Ebenen)
In Fällen, in denen es bequemer oder logischer ist, über Berechtigungen auf Methodenebene zu verfügen, wird ein Fall in Betracht gezogen, in dem verschiedene Benutzer dieselben "direkten" Aktionen ausführen können (damit die Client-Sicherheit nicht relevant ist). In einigen Fällen kann ihre Aktion jedoch ein Verhalten auslösen, das Sie einschränken möchten. In diesem Fall kann die Sicherheit auf Methodenebene eine relevante Lösung sein.
quelle
Mike Wiesner erinnerte in dieser SpringSource-Präsentation, Introduction to Spring Security 3 / 3.1 , an das Beispiel, dass Tomcat und viele andere Servlet-Container einen Fehler hatten, der "../" nicht richtig erkannte, wenn er in Unicode codiert war Ein einfacher Gleichheitstest schlägt in Java fehl, wird jedoch in das übergeordnete Verzeichnis im Dateisystem übersetzt.
Sicherheit ist hart, mehrere Sicherheitsstufen verbessern die Chancen, Umgehungsversuche zu blockieren. Da die Sicherheit auf Methodenebene direkt in der Klasse codiert ist, rufen Sie nach der AOP-Erweiterung beim Aufrufen der Methode die Sicherheitsüberprüfung immer vorher auf.
quelle
Ich nehme an, dass Sie hier über öffentliche, private und geschützte Methoden sprechen?
Wenn ja, dann existieren sie nicht zum Zweck der Sicherheit. Sie dienen dazu, die Modularisierung der Software zu vereinfachen oder zu gewährleisten. (Ob ihnen das gelingt, werde ich anderen überlassen. Das ist jedoch die Vision, wofür sie da sind.)
Angenommen, ich liefere eine Bibliothek aus, dann kann ich später eine andere Version der Bibliothek ausliefern und als privat markierte Inhalte so oft ändern, wie ich möchte. Hätte ich dieses Zeug dagegen nicht als privat markiert, könnte ich keine Interna meiner Software ändern, da wahrscheinlich irgendwo jemand direkt darauf zugreift. Sicher, theoretisch liegt es an ihnen, dass sie die dokumentierte API nicht verwenden. Aber der Kunde wird es als meine Schuld ansehen, dass mein Software-Upgrade seine Software beschädigt hat. Sie wollen keine Ausreden, sie wollen, dass es behoben wird. Wenn ich ihnen jedoch zunächst keinen Zugriff gewähre, entspricht meine API genau den öffentlichen Methoden, die ich als meine API festlegen wollte, und das Problem wird vermieden.
Das zweitwahrscheinlichste, worüber Sie sprechen könnten, ist das Sicherheitsmodell von Java. Wenn Sie darüber sprechen, dann bestand der Grund dafür darin, dass die ursprüngliche Vision für Java darin bestand, dass Leute möglicherweise nicht vertrauenswürdige Applets sendeten, um interaktiv in Programmen von Drittanbietern (z. B. Browsern) zu arbeiten. Daher sollte das Sicherheitsmodell den Benutzern einen gewissen Schutz vor böswilligen Applets bieten. Daher besteht die Sicherheitsbedrohung darin, dass nicht vertrauenswürdige Applets versuchen, mit anderer Software zu interagieren, die möglicherweise geladen ist.
quelle