Was ist der “Prinzipal” in Spring Security?

Lesezeit: 5 Minuten

Benutzer-Avatar
Nr

Ich bin wirklich neu bei Spring und Spring Security. Ich habe über Spring Security gelesen und es kam das Konzept von heraus Rektor, das sollte der aktuell angemeldete Benutzer sein. Aber was ist, wenn wir mehr als einen aktuell angemeldeten Benutzer haben? Meine Frage ist also, was genau ist dann das Prinzip der Frühjahrssicherheit?

Ich habe zum Beispiel dieses Tutorial gelesen:

http://www.mkyong.com/spring-security/get-current-logged-in-username-in-spring-security/

und sie scheinen zu berücksichtigen, dass es nur einen aktuell angemeldeten Benutzer gibt, was nicht oft der Fall ist.

Wie kann ich einen bestimmten Benutzer abrufen? Und wie unterscheide ich zwischen Benutzern, die Anfragen stellen?

  • Siehe auch: stackoverflow.com/q/4989063/3924118.

    – nbro

    16. März 2018 um 13:38 Uhr

Benutzer-Avatar
Marcel Stör

Der Rektor ist der aktuell angemeldete Benutzer. Sie rufen es jedoch über den Sicherheitskontext ab, der an den aktuellen Thread gebunden ist, und somit auch an die aktuelle Anforderung und ihre Sitzung.

SecurityContextHolder.getContext() erhält intern den Strom SecurityContext Umsetzung durch a ThreadLocal Variable. Da eine Anfrage an einen einzelnen Thread gebunden ist, erhalten Sie den Kontext der aktuellen Anfrage.

Vereinfachend könnte man sagen, dass sich der Sicherheitskontext in der Sitzung befindet und Benutzer/Prinzipal und Rollen/Autoritäten enthält.

Wie kann ich einen bestimmten Benutzer abrufen?

Du nicht. Alle APIs sind so konzipiert, dass sie den Zugriff auf den Benutzer und die Sitzung der aktuellen Anfrage ermöglichen. Lassen Sie Benutzer A einer von 100 derzeit authentifizierten Benutzern sein. Wenn A eine Anfrage an Ihren Server sendet, weist er einen Thread zu, um diese Anfrage zu verarbeiten. Wenn du es dann tust SecurityContextHolder.getContext().getAuthentication() Sie tun dies im Rahmen dieses Threads. Standardmäßig haben Sie innerhalb dieses Threads keinen Zugriff auf den Kontext von Benutzer B, der von einem anderen Thread verarbeitet wird.

Und wie unterscheide ich zwischen Benutzern, die Anfragen stellen?

Das müssen Sie nicht, das erledigt der Servlet-Container für Sie.

  • Meine Folgefrage lautet also: Wie unterscheidet Spring zwischen Sitzungen und Benutzern? Ich denke, das erfordert ein tieferes Verständnis des Frühlings …

    – nbro

    28. Mai 2016 um 13:06 Uhr

  • Vielen Dank! Gute Antwort. Ich habe nur einen Zweifel, der von meiner begrenzten Erfahrung in der Erstellung von Webanwendungen usw. herrührt. Aber lassen Sie mich vorher versuchen zu erklären, was ich zu wissen glaube. Nach dem, was ich gelernt habe, können HTTP-Anforderungen mit Sitzungs-IDs erweitert werden. Diese Informationen werden wahrscheinlich von Tomcat (oder was auch immer) verwendet, um zwischen Benutzern und Anfragen zu unterscheiden. Prinzipal ist der aktuell angemeldete Benutzer für den aktuellen Kontext. Um zu verstehen, dass es einen angemeldeten Benutzer (ein Prinzipal) gibt, muss ihm wahrscheinlich eine Sitzungsnummer zugeordnet werden.

    – nbro

    28. Mai 2016 um 13:38 Uhr

  • Angenommen, ich habe zwei angemeldete Benutzer angerufen root und admin und ich habe einen Controller, dessen Request-Mapping ist /users/{username}. Nehme das weiter an root spielt mit seinem Account auf der Clientseite an der URL www.host.com:3000/users/root. Ich vermute, dass zu diesem Zeitpunkt bereits eine Sitzungs-ID für root generiert wurde. Wenn es jetzt versucht, eine Anfrage zu machen www.host.com:3000/users/adminindem Sie beispielsweise die URL manuell ändern und der Administrator auch von einem anderen Computer aus verbunden und angemeldet ist. Was würde in diesem Fall passieren?

    – nbro

    28. Mai 2016 um 13:38 Uhr


  • Ich vermute, dass dies vom Server nicht zugelassen wird, da die Anfrage wahrscheinlich nicht die richtigen Informationen enthält, dh die richtige Sitzungs-ID?

    – nbro

    28. Mai 2016 um 13:38 Uhr

  • @nbro Mit RestController muss nur das Principal-Argument hinzugefügt werden wie hier, Spring füllt es automatisch aus, und Sie können jede gewünschte Sicherheitsüberprüfung durchführen. (z. B. wenn P „root“ ist, aber versucht, die „admins“-Seite zu sehen, einen 403-Fehler auslöst, es aber zulässt, dass er versucht, auf seine Seite zu gelangen.) Siehe Abschnitt 15.3.2.3 hier für alle Argumente, die Sie auswählen können, wird Spring automatisch für Sie ausgefüllt.

    – Glen Mazza

    29. Mai 2016 um 5:53 Uhr

Kurze Definition des Auftraggebers:

EIN Rektor stellt die Identität eines Benutzers dar.

Es kann ein String-Objekt mit einem Benutzernamen auf einer einfachen oder einer komplexen Ebene sein Nutzerdetails Objekt.

Principal ist nur eine alte Schnittstelle von Java SE 6.

Wie alle Schnittstellen ohne Standardimplementierung es einfach definiert einige Methoden die von der Klasse implementiert werden müssen, die diese Schnittstelle implementiert.

Diese Methoden sind

boolean  equals(Object another)
          Compares this principal to the specified object.

String   getName()
          Returns the name of this principal.

int      hashCode()
          Returns a hashcode for this principal.

String   toString()
          Returns a string representation of this principal.

Als die Java-Doc Zustände :

Diese Schnittstelle stellt den abstrakten Begriff eines Prinzipals dar, die verwendet werden kann, um eine beliebige Entität darzustellen, z. B. eine Einzelperson, ein Unternehmen und eine Anmelde-ID.

Einfach ausgedrückt wird es nur verwendet, damit der Implementierer diese Schnittstelle so implementieren muss, dass er eine Entität eindeutig von anderen Entitäten unterscheidet. Auch die getName() muss einen Wert zurückgeben, durch den eine bestimmte Entität eindeutig identifiziert wird und nicht mit anderen Entitäten kollidiert. Also wenn die Principal was verwendet wird, ist vom Typ UserDetails dann ist die getName() von Principal gibt die zurück UserName von UserDetails.

Wenn wir die Implementierung sehen, für die Spring verwendet AbstractAuthenticationToken.class :

public String getName() {
        if (this.getPrincipal() instanceof UserDetails) {
            return ((UserDetails)this.getPrincipal()).getUsername();
        } else if (this.getPrincipal() instanceof AuthenticatedPrincipal) {
            return ((AuthenticatedPrincipal)this.getPrincipal()).getName();
        } else if (this.getPrincipal() instanceof Principal) {
            return ((Principal)this.getPrincipal()).getName();
        } else {
            return this.getPrincipal() == null ? "" : this.getPrincipal().toString();
        }
    }

Außerdem ist wichtig zu erwähnen:

abstract class AbstractAuthenticationToken implements Authentication und

interface Authentication extends Principal

Principal Die Schnittstelle stellt auch sicher, dass der Implementierer implementiert equals() und hashCode() Dies ist sehr sinnvoll, da die Entität des Auftraggebers, die eine Organisation, ein Unternehmen oder eine Person darstellt, auf irgendeine Weise mit anderen Entitäten verglichen werden muss.

1158750cookie-checkWas ist der “Prinzipal” in Spring Security?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy