2014-03-05 13 views
5

Ich mag umgehen manuell den Benutzer von Spring Security mit dem folgenden Code:SecurityContextHolder.getContext() getAuthentication() Rückkehr null

User localeUser = new User(); 
UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken(localeUser ,null, localeUser .getAuthorities()); 
SecurityContext securityContext = SecurityContextHolder.getContext(); 
     securityContext.setAuthentication(auth); 
     // Create a new session and add the security context. 
     HttpSession session = request.getSession(true); 
     session.setAttribute("SPRING_SECURITY_CONTEXT", securityContext); 
return "dummyLogin"; 

Die Dummy-Login-Seite (von Fliesen behandelt) ruft intern eine andere Anfrage Mapping in den gleichen Controller, wo ich versuche, die Authentifizierung so etwas zu bekommen.

SecurityContextHolder.getContext().getAuthentication() 

Wo ich null bekomme !!!.

Bitte helpp!

+0

Sie übergeben ein leeres Benutzerobjekt an den UsernamePasswordAuthenticationToken-Konstruktor. Vielleicht ist das der Grund, warum Sie null bekommen. – Selva

+0

Auch ein Null-Passwort (ich denke, das ist auch illegal). Vielleicht, wenn Sie den Stack-Trace zeigen? –

+0

Passwort kann Null sein, würde ich lieber überprüfen, ob die Sitzung die gleiche ist, nachdem Sie es erstellt und in Code, die getAuthentication ausführen. Protokollieren Sie Ihre session.getId(), um es zu überprüfen. – freakman

Antwort

7

So verwende ich das eigentliche Problem gefunden !. Das Problem war, dass ich den gesamten Controller mit security = "none" in der security-context.xml markiert hatte. Also, wenn es von der ersten Verbindung zur zweiten gebounced wurde, wird es keinen Sicherheitskontext damit passieren !! Sorry fr die Ärger Jungs.

0

Ihr localUser ist null.So wird die Berechtigung null.So wurde dem Sicherheitskontext kein Authentifizierungsobjekt hinzugefügt.

Bitte haben Blick auf die doc

http://docs.spring.io/spring-security/site/docs/3.0.x/apidocs/org/springframework/security/core/userdetails/User.html

es besser, eine customUserDetailsService haben

public class CustomUserDetailsService implements UserDetailsService 

//implement the method which return a UserDetails Object 
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException 

dann können Sie

UserDetails userDetails= customUserDetailsService.loadUserByUsername("name"); 
Authentication authentication= new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities()) ; 
SecurityContextHolder.getContext().setAuthentication(authentication); 
+0

localUser ist nicht null! .its ein benutzerdefiniertes Benutzerobjekt von die Anwendung, die bei der Initialisierung selbst die Ids und Details in ihr erstellt hat. –

2

Zusätzliche Antwort: Wenn Sie erhalten angemeldet in möchten Benutzerdaten für eine nicht gesicherte URL dann können Sie sie gesichert URLs hinzufügen und als „permitAll“ wie folgt vergeben:

<http> 
    //... 

    <intercept-url pattern="/your/url/**" access="permitAll"/> 

    //... 
</http> 

Dann können Sie den eingeloggten Benutzer überprüfen, wenn Sie eingeloggt sind oder die Zugangsdaten erhalten.