2012-04-10 3 views
1

Ich habe nur Spring Security eingerichtet und es funktioniert super. Ich kann mich mit meinem benutzerdefinierten Formular an- und abmelden. Ich habe mich dann mehrmals hintereinander ohne Probleme eingeloggt. Seltsamerweise, wenn ich versuche, mich mit dem falschen Passwort anzumelden, kann ich mich nicht mehr einloggen - es bringt mich jedes Mal zur Seite "loginFailed", wenn ich versuche, mich anzumelden. Kann jemand das beheben?Spring Security - kann nach der Eingabe des ungültigen Passworts nicht einloggen

Hier ist meine Sicherheits-config.xml:

<beans:beans xmlns="http://www.springframework.org/schema/security" 
xmlns:beans="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans.xsd 
     http://www.springframework.org/schema/security 
     http://www.springframework.org/schema/security/spring-security-3.0.3.xsd"> 


<http use-expressions="true"> 
    <intercept-url pattern="/secureA.htm" access="isAuthenticated()" /> 
    <intercept-url pattern="/secureB.htm" access="isAuthenticated()" /> 
    <form-login login-page="/login.htm" default-target-url="/secureA.htm" 
     authentication-failure-url="/loginFailed.htm"/> 
    <logout logout-success-url="/login" /> 
</http> 

<authentication-manager> 
    <authentication-provider> 
    <password-encoder hash="sha"> 
    </password-encoder> 
    <user-service> 
     <user name="user" password="pass" 
      authorities="ROLE_USER, ROLE_ADMIN" /> 
    </user-service> 
    </authentication-provider> 
</authentication-manager> 

</beans:beans> 

Mein Login-Formular:

<form action="<c:url value='j_spring_security_check' />" method="post"> 
Username:&nbsp;<input type="text" name="j_username" /><br/> 
    Password:&nbsp;<input type="password" name="j_password" /><br/> 
    <input type="submit" value="Login" /><br/> 
</form> 

Mein Login-Controller:

@Controller 
public class LoginController { 

    @RequestMapping(value = "/login", method = RequestMethod.GET) 
    public String welcome(ModelMap m) { 
     return "login"; 
    } 

    @RequestMapping(value = "/loginFailed", method = RequestMethod.GET) 
    public String failed(ModelMap m) { 
     m.addAttribute("error", "Invalid username or password"); 
     return "login"; 
    } 

    @RequestMapping("logout.htm") 
    public String logout(ModelMap m) { 
     return "redirect:login.htm"; 
    } 
} 

Antwort

0

Nun, ich weiß nicht, was das Problem war, aber ich konnte es lösen. Ich habe gerade einen älteren SO Post gefunden: Spring security blocks user after failed login. Timhs Antwort auf den Wechsel zu Spring 3.0.7.RELEASE (ab 3.0.6) funktionierte für mich. Entschuldigung für das Double-Posting.

Wenn jemand weiß, warum das in 3.0.6 passierte, würde mich das interessieren.

0

Wenn Sie zu derselben sind Rückkehr Seite, in der Sie angemeldet sind, wird das Modell ausgeführt. Da Sie diesem Modell ein Attribut hinzufügen, prüfen Sie vermutlich, ob dieses Attribut auf der Ansichtsseite festgelegt ist. Sobald es eingerichtet ist, wird nichts deaktiviert, bis Ihre Sitzungsobjekte gelöscht sind.

Um zu bestätigen, ändern diese:

@RequestMapping(value = "/login", method = RequestMethod.GET) 
public String welcome(ModelMap m) { 
    System.out.println(m.getAttribute("error"); 
    return "login"; 
} 

Und dann Ihre Konsole überprüfen.

0

Dies ist, weil: https://jira.springsource.org/browse/SEC-1493

org.springframework.security.core.userdetails.eraseCredentials() auf Authentifizierung aufgerufen wird.

Lösung sollte Parameter Erase-Anmeldeinformationen = "falsch" für Authentifizierung-Manager sein, aber anscheinend hat es nicht für mich in Frühling 3.1.0 oder 3.1.3.

Work-around wäre, Benutzerdetails bei jeder Authentifizierungsanforderung neu zu laden.

Verwandte Themen