2009-06-18 10 views
36

Ich verwende Wicket mit dem Wicket Auth-Projekt für meine Präsentationsebene und ich habe es daher mit Spring Security integriert. Dies ist die Methode, die von Wicket für die Authentifizierung für mich genannt wird:Programmatische Verwendung von Spring Security

@Override 
public boolean authenticate(String username, String password) { 
    try { 
     Authentication request = new UsernamePasswordAuthenticationToken(
       username, password); 
     Authentication result = authenticationManager.authenticate(request); 
     SecurityContextHolder.getContext().setAuthentication(result); 
    } catch (AuthenticationException e) { 
     return false; 
    } 
    return true; 
} 

Der Inhalt (innen) meiner Spring Security XML-Konfiguration sind:

<http path-type="regex"> 
    <form-login login-page="/signin"/> 
<logout logout-url="/logout" /> 
</http> 
<global-method-security secured-annotations="enabled" /> 
<authentication-manager alias="authenticationManager"/> 
<authentication-provider user-service-ref="userService"> 
    <password-encoder ref="bcryptpasswordencoder" /> 
</authentication-provider> 

Der Abschnitt 2.3.6. Session Fixation Attack Protection der Referenzdokumentation sagt:

Fixierung Session-Angriffe sind ein potenzielles Risiko, wo es möglich einen böswilligen Angreifer ist ein erstellen Sitzung durch Zugriff auf eine Website, dann einen anderen Benutzer überreden, mit die gleiche Sitzung einzuleiten (indem Sie ihnen eine Verbindung mit dem Sitzungsbezeichner als Parameter senden, zum Beispiel). Frühling Security schützt gegen diese automatisch durch eine neue Sitzung erstellen, wenn sich ein Benutzer anmeldet. Wenn Sie nicht diesen Schutz benötigen, oder es Konflikte mit einer anderen Anforderung, Sie das Verhalten mit Kontrolle kann der Session- Fixierung Schutz Attribut auf, die drei Optionen:

  • migrateSession - erstellt eine neue Sitzung und kopiert die vorhandenen Sitzung auf die neue Session-Attribute. Dies ist der Standardwert.
  • keine - Tun Sie nichts. Die ursprüngliche Sitzung wird beibehalten.
  • newSession - Erstellen Sie eine neue "saubere" Sitzung, ohne die vorhandenen Sitzungsdaten zu kopieren.

Die Authentifizierung funktioniert, aber ich, als ich auf Spring Security ziemlich neu bin habe ich einige Fragen, die ich Antworten zu müssen:

  • Normalerweise für die Anmeldung, würde ich die Authentifizierung POST Informationen zu j_spring_security_check und lassen Spring Security den tatsächlichen Authentifizierungscode ausführen. Ich hätte gerne Schutz vor Session-Fixation-Attacken, werde ich es bekommen, wenn ich wie ich einen programmatischen Login mache? Und wenn nicht, was müsste ich tun, um es zu bekommen?
  • Wie führe ich eine programmgesteuerte Abmeldung durch?
  • Wie werde ich die programmatische An- und Abmeldung verwenden, wie sperre ich Spring abfangen diese URLs?

Update: Für Sitzungsschutz-Fixierung Angriff scheint es, dass ich die Methode in der SessionUtils Klasse mit der Unterschrift startNewSessionIfRequired(HttpServletRequest request, boolean migrateAttributes, SessionRegistry sessionRegistry) anrufen müssen.

Wie bekomme ich die SessionRegistry-Instanz, die ich übergeben muss? Ich kann keine Möglichkeit finden, eine Alias-ID für sie zu erstellen, oder wie sie ihre ID oder ihren Namen erhält.

+0

Bounty zur ersten gegeben wird, um eine Antwort auf die drei Fragen über –

+0

Hey Kent veröffentlichen - ich die Fragen beantwortet und Ihnen die Prämie lassen abgelaufen - warum ? – Pablojim

+0

Sorry, ich hatte einige persönliche Angelegenheiten, die mich davon abhalten, mich einzuloggen. –

Antwort

22

Vielleicht ist es keine vollständige Antwort auf Ihre Fragen, aber vielleicht könnte es Ihnen helfen.

org.springframework.security.ui.webapp.AuthenticationProcessingFilter

ich Sie damit in Ihrem Code inspiriert wurden erraten:

Der Code aufgerufen wird, wenn Sie nicht über programmatische Login verwenden, aber ein Standard ist hier zu finden. Es sieht ziemlich ähnlich aus.

Ähnlich der Code ausgeführt, wenn Sie die /j_spring_security_logout im Standardansatz zuzugreifen, ist hier zu finden:

org.springframework.security.ui.logout.LogoutFilter

Die LogoutFilter mehrere Handler aufruft. Der Handler wir verwenden heißt: org.springframework.security.ui.logout.SecurityContextLogoutHandler, so dass Sie den gleichen Code in Ihrem Ansatz nennen könnten.

+0

Was für eine nette Antwort! :-) Ich war ein bisschen mehr als inspiriert, von der Frühjahr 3.0 Referenz Dokumentation (die drei Zeilen in meinem Versuch Block sind eine direkte Kopie-Paste): http://static.springframework.org/spring-security/site /docs/3.0.x/reference/technical-overview.html#d4e689. Ich sollte jedoch beachten, dass ich 2.0.4 verwende. Ich werde in den Code schauen, den Sie erwähnten! Vielen Dank! Ich lasse die Frage vorerst offen, da ich immer noch nach Antworten auf meine OP-Fragen suche. –

8

Sie werden in der Tat offen zu Sitzung Fixierungen Angriffe. Um das zu beheben, könnte man sich wieder vom Spring-Code inspirieren lassen. Um eine neue Sitzung zu erstellen, benötigen Sie natürlich Zugriff auf die httpsession, so dass Sie eventuell etwas Refactoring durchführen müssen.

Wenn Sie die Methode SessionUtils sehen. startNewSessionIfRequired.

Dies wird die Authentifizierung auf eine neue Sitzung migrieren. Sie können diese Methode möglicherweise direkt aufrufen oder den Code ein wenig umgestalten.

Bei der programmgesteuerten Abmeldung können Sie nicht zu weit gehen, indem Sie einfach session.invalidate() anrufen, wenn Sie die Person abmelden müssen. Dies wird aus einer allgemeinen Sicherheitsperspektive alles Notwendige tun, aber bedenken Sie, dass Sie möglicherweise einige Dinge in der Sitzung bereinigen müssen. Wenn Sie einen sehr komplizierten Satz von Filtern usw. haben, und Sie müssen sicherstellen, dass der Benutzer für den Rest aus der Anforderung angemeldet ist, dann können Sie hinzufügen:

SecurityContextHolder.getContext().setAuthentication(null); 

Wie für das Abfangen von der URL könnten Sie einfach setze sie auf etwas Unbenutztes und ignoriere es! Ich bin nicht sicher, ob Sie das Abfangen in der Konfiguration abstellen können - wenn Sie es wirklich entfernen möchten, dann werfen Sie einen Blick auf die AuthenticationProcessingFilter - Sie konnten dieses besonders anfertigen. Wenn Sie dies tun, müssen Sie die Spring-Sicherheits-XML manuell einrichten und die bereitgestellten Namespaces nicht verwenden. Es ist jedoch nicht zu schwer - schauen Sie sich ältere Dokumente an und Sie werden sehen, wie das geht.

Hoffe, das hilft!

+0

Ich habe oben ein Update erstellt, da ich Probleme mit dem Schutz der Sitzungsfixierung habe. –

+0

Müssen Sie gleichzeitige Sitzungen begrenzen? z.B. denselben Benutzer zweimal in zwei verschiedenen Sitzungen anmelden lassen? Wenn nicht, benötigen Sie keine SessionRegistry - übergeben Sie einfach einen Nullwert an die SessionUtils-Methode. Wenn Sie dies benötigen, dann wenn Sie es implementieren, haben Sie eine SessionRegistry! siehe hier: http://static.springframework.org/spring-security/site/docs/2.0.x/reference/ns-config.html#ns-concurrent-session wieder für Sie Sie benötigen um es selbst zu konfigurieren und den benutzerdefinierten Namespace nicht zu verwenden. Meine Vermutung ist, dass Sie diese Funktionalität nicht benötigen. – Pablojim

+0

SessionUtils wurde in Spring-Security 3.0 entfernt, sieht aus wie org.springframework.security.web.authentication.session.SessionFixationProtectionStrategy.onAuthentication() (und seine Unterklasse ConcurrentSessionControlStrategy) ist seine nächstgelegene Ersatz. –

6

1) Programmatische Logout

  1. Anruf HttpServletRequest.getSession (false) .invalidate
  2. Anruf SecurityContextHolder.clearContext()

2) Sagen Sie Spring Security NICHT bestimmte URLs abfangen, diese Eine Art davon hängt davon ab, wie Ihr Anwendungs-URL-Bereich eingerichtet ist. Wenn alle Seiten (außer/An- und/Logout) im Kontext/myApp lebten dann könnte man dies tun:

<http ....> 
    <intercept-url pattern="/myApp/**" ..> 
.... 
</http> 
0

programmatische Logout Dazu ist es auch möglich, ein org.springframework.security.core.AuthenticationException zu werfen. Zum Beispiel SessionAuthenticationException. In diesem Fall initiieren Sie ExceptionTranslationFilter Logout.

1

hatte ich ein Problem mit dem programmatischen Login.Ich rief alle authenticationManager.authenticate(...) und SecurityContextHolder.getContext().setAuthentication(...) Methoden, hatte aber einige Probleme mit der Sitzung. Ich hatte die folgenden Zeilen hinzufügen, um richtig die Sitzung zu verwalten:

HttpSession session = request.getSession(); 
session.setAttribute("SPRING_SECURITY_CONTEXT", SecurityContextHolder.getContext()); 

Dieses aus dem Beispielcode nicht klar war, oben gepostet. Weitere Blick auf http://forum.springsource.org/showthread.php?t=69761

0

können Sie versuchen, diese

try { 
     HttpSession session = request.getSession(false); 
     if (session != null) { 
      session.invalidate(); 
     } 

     SecurityContextHolder.clearContext(); 

    } catch (Exception e) { 
     logger.log(LogLevel.INFO, "Problem logging out."); 
    } 
Verwandte Themen