2010-12-30 4 views
0

hier ist mein Fall.Feder Sicherheits Aufenthalt auf Single URL beim Login

Wenn Benutzer zum ersten Mal auf der Website landen, werden sie auf die Anmeldeseite zeigen. (Lest sagen http://ex.com/) und wenn sie erfolgreich anmelden, werden sie die andere Seite mit der gleichen URL sehen (http://ex.com/

aber, wenn sie die Website auf anderen Registerkarte öffnen (http: // ex.com) sie werden auf Login-Seite zeigt zurück.

, wie dieser Fall in meiner Seite mit Feder Sicherheit implementieren?

sein einfach, wenn Deal mit herkömmlichen Servlet zu tun. ich muß nur 2-Methode hat (doGet zum Anzeigen der Anmeldeseite und doPost zum Authentifizieren des Benutzers und wenn es gültig ist, wird eine andere Ansicht aufgerufen.)

Hier ist meine Konfiguration:

<security:http auto-config="true">   
    <security:intercept-url pattern="/login*" access="IS_AUTHENTICATED_ANONYMOUSLY" />     
    <security:form-login login-page="/login" 
         login-processing-url="/loginProcess" 
         default-target-url="/login" 
         authentication-failure-url="/login?login_error=1" /> 
    <security:logout logout-url="/logout" logout-success-url="/logoutSuccess" /> 
</security:http> 
+0

Können Sie überprüfen, ob die Cookies zurück an den Server gesendet werden, wenn die Website in einem neuen Tab geöffnet wird. Welchen Browser benutzen Sie?Es muss ein Problem mit dem Cookie sein. Was ist der Ablaufwert des 'JSESSIONID'-Cookies? –

+0

es tut mir leid, ich verstehe nicht, was ist mit Cookies Probleme mit meinem Fall? –

+0

In der zweiten Registerkarte gelangen Sie zum Anmeldebildschirm, da Ihr Webclient die authentifizierte Sitzungs-ID zurücksendet, wenn die Ressource angefordert wird. Der Cookie 'JSESSIONID' enthält die authentifizierte Sitzungs-ID. –

Antwort

2

** Bearbeitet (entfernen unabhängige Antwort)

Es scheint, Sie brauchen ein gleichzeitiges Session-Management mit Spring Security hinzuzufügen. Siehe folgenden Link: http://static.springsource.org/spring-security/site/docs/3.1.x/reference/session-mgmt.html

Sie können die SessionRegistry injizieren und sehen, ob der Prinzipal bereits angemeldet ist. Wenn er ist, rufen Sie die expireNow()

Oder Sie können einen Filter am oder vor dem SessionManagementFilter im FilterChainProxy implementieren:

Die SessionManagementFilter den Inhalt der SecurityContextRepository gegen den aktuellen Inhalt des SecurityContextHolder überprüft, um zu bestimmen ob ein Benutzer während der aktuellen Anfrage authentifiziert wurde, typischerweise durch einen nicht interaktiven Authentifizierungsmechanismus, wie z. B. Vorauthentifizierung oder remember-me [19]. Wenn das Repository einen Sicherheitskontext enthält, führt der Filter nichts aus. Wenn dies nicht der Fall ist und der threadlokale SecurityContext ein (nicht anonymes) Authentifizierungsobjekt enthält, geht der Filter davon aus, dass er von einem vorherigen Filter im Stapel authentifiziert wurde. Es ruft dann die konfigurierte SessionAuthenticationStrategy auf. - http://static.springsource.org/spring-security/site/docs/3.1.x/reference/session-mgmt.html

+0

Nein, meine Frage ist nicht wie Frühling mit Ajax interagieren. aber wahrscheinlicher, wie man url auf einem Muster bleibt. Bitte lies meine Frage noch einmal. Danke :) –

+0

Das muss ein Fehler sein. Ich muss eine andere Frage beantworten. Meine Antwort ist völlig von der Frage entfernt. Mein Fehler. Ich muss den Beitrag finden, der die Frage stellte, die ich beantwortete :) – chris

+0

die Sitzung der ersten Registerkarte muss noch. aber die zweite Registerkarte zeigt auf die Anmeldeseite. und wenn sie versuchen, sich mit demselben Benutzernamen anzumelden, wird sie verworfen. –

1

Ich denke, Ihre Konfiguration ein Problem hat

<security:http auto-config="true">   
    <security:intercept-url pattern="/login*" access="IS_AUTHENTICATED_ANONYMOUSLY" />     
    <security:form-login login-page="/login" 
         login-processing-url="/loginProcess" 
         default-target-url="<home-page-url. ex: /home>" 
         authentication-failure-url="/login?login_error=1" /> 
    <security:logout logout-url="/logout" logout-success-url="/logoutSuccess" /> 
</security:http> 

Die default-target-url sollte auf die Standardseite zeigen, die die Anwendung nach einer erfolgreichen Anmeldung umgeleitet hat.

EDITED Nachdem wieder durch die erforderlichen geschrieben gehen, ich denke, der Ansatz ist die Steuerung der Handhabung /login Antrags stellen beiden Fälle

import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

import org.springframework.security.core.Authentication; 
import org.springframework.security.core.context.SecurityContextHolder; 
import org.springframework.security.core.userdetails.User; 
import org.springframework.stereotype.Controller; 
import org.springframework.web.servlet.ModelAndView; 

@Controller 
public class AppsController { 

    @RequestMapping("/login") 
    public ModelAndView view(HttpServletRequest request, 
      HttpServletResponse response) { 

     Authentication authentication = SecurityContextHolder.getContext() 
       .getAuthentication(); 
     User user = authentication != null 
       && authentication.getPrincipal() instanceof User ? (User) authentication 
       .getPrincipal() : null; 

     return user == null ? getLoginModelAndView() : getHomeModelAndView(); 
    } 

    private ModelAndView getHomeModelAndView() { 
     return null; 
    } 

    private ModelAndView getLoginModelAndView() { 
     return null; 
    } 

} 

zu behandeln Wenn es keine authentifizierten Benutzer in der Sitzung des Der Controller gibt die Anmeldeseite zurück, aber sobald der Benutzer angemeldet ist, wird eine andere Seite zurückgegeben.

Die Spring-Sicherheit speichert die für die Benutzersitzung protokollierte Sitzung und kann mit der SecurityContextHolder abgerufen werden.

+0

Das wird immer noch nicht funktionieren. Versuchen Sie, eine neue Registerkarte zu erstellen. Sie können sich immer noch anmelden oder auf dieselbe Seite zugreifen. – chris

+0

Haben Sie nach der erfolgreichen Anmeldung dieselbe URL für die Anmeldeseite und die Zielseite? Wie haben Sie Ihren Login-Controller implementiert? Gibt es einen GET- und POST-Methodenhandler für/login url? –

+0

Bitte lesen Sie meine Frage sorgfältig. Ich brauche meine Login-Seite wie die URL nach der Benutzeranmeldung. aber mit anderer Sichtweise. und wenn Benutzer von einem anderen Tab auf die Site zugreifen, wird ihnen die Anmeldeseite erneut angezeigt. nicht die Ressourcenseite, die sie nach dem Login sehen. Dieses Verhalten ist bei Verwendung des normalen Servlets möglich. aber ich habe keine Idee, wie man es unter Verwendung der Federsicherheit einsetzt. Ich habe eine Idee gedacht, ich werde eine andere Frage erstellen. –

Verwandte Themen