2014-02-18 14 views
5

Ich möchte Authentifizierung mit meiner Anwendung verwenden. Ich habe eine Spring MVC App und Spring Security angewendet. Gegen Browser funktioniert es gut. Das bedeutet, ich authentifiziere einen Benutzer für meine App und benutze eine Webseite.Spring Security, Restauthentifizierung und CSRF

Jetzt möchte ich Ruhe nutzen. Ich habe auf meiner unsicheren Controller-Methode @ResponseBody hinzugefügt und ich erhalte Antwort in JSON. Aber wie mit RestTemplate mit Benutzername und Passwort zu meiner Anwendung verbinden?

Mein Code in RestClient ist (zum Test):

public void unsecureProfileTest() { 

    String url = articleServiceUrl + "unsecure/profile/test.json"; 
    url = articleServiceUrl + "secure/profile/wiew.json"; 
    HttpEntity<Object> entity = new HttpEntity<Object>(getHeaders("user:userpassword")); 
    Object s = restTemplate.exchange(url, HttpMethod.GET, entity, Object.class); 

} 

static HttpHeaders getHeaders(String auth) { 
    HttpHeaders headers = new HttpHeaders(); 
    headers.setContentType(MediaType.APPLICATION_JSON); 
    headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON, 
      MediaType.TEXT_HTML)); 

    byte[] encodedAuthorisation = Base64.encode(auth.getBytes()); 
    headers.add("Authorization", "Basic " 
      + new String(encodedAuthorisation)); 

    return headers; 
} 

Mein SecurityConfig:

@Override 
protected void configure(HttpSecurity http) throws Exception { 

    http.csrf().disable(); 

    http.authorizeRequests().antMatchers("/*").permitAll().and() 
      .formLogin().successHandler(successHandler) 
      .defaultSuccessUrl("/").failureHandler(failureHandler) 
      .failureUrl("/login?error=true").permitAll().and().logout() 
      .permitAll(); 

    http.authorizeRequests().antMatchers("/resources/**").permitAll(); 
    http.authorizeRequests().antMatchers("/welcome").permitAll(); 
    http.authorizeRequests().antMatchers("/unsecure/**").permitAll(); 

    http.authorizeRequests().antMatchers("/secure/*").authenticated(); 
    http.authorizeRequests().antMatchers("/admin/**").hasRole("ADMIN") 
      .anyRequest().authenticated(); 
} 

Das Ergebnis ist: Zugriff verweigert wird. Ich vermute das Problem kommt von der Authentifizierung von RestTemplate, aber wie kann ich authentifizieren?

Meine zweite Frage ist in Bezug auf csrf, die behindert ist, aber ich möchte es ermöglichen (meine Formen, die sie verwenden)

Ich bin mit Frühling 4.0 und Spring Security 3,2

EDIT I mein Code mit

aktualisiert
String url = articleServiceUrl + "unsecure/profile/test.json"; 
url = articleServiceUrl + "secure/profile/wiew.json"; 
HttpEntity<Object> entity = new HttpEntity<Object>(getHeaders("{user:userpassword, password:userpassword}")); 
Object s = restTemplate.exchange(url, HttpMethod.GET, entity, Object.class); 

I erhalten Sie einen Code 302

EDIT 18022014 - 16:46 ich

aktualisiert
String url = articleServiceUrl + "login?username=user&password=userpassword"; 
HttpEntity entity restTemplate;exchange(url, HTTPMethod.POST,null, HttpEntity.class) 
system.out.println(entity); 

Im Protokoll des Web-Servers erhielt ich eine Erfolgsmeldung (siehe Userdetails auf "user").

Jetzt möchte ich Authentifizierung verwenden möchte andere URL zuzugreifen ("secure/profile/view.json")

Wie Authentifizierung halten?

Danke

+0

formularbasierte Authentifizierung nicht eine gute Wahl ist, wenn Sie (und möglicherweise keine Sitzung) keine interaktive Login haben. Erwägen Sie stattdessen die Verwendung einer einfachen Authentifizierung. –

+0

Ich habe ein interaktives Login, weil ich eine Website habe, um Benutzer und viele Dinge zu verwalten, die von Admins gemacht wurden. –

+0

Ja, aber das ist vermutlich ein separates Anliegen von der ReST API, über die du in dieser Frage sprichst? Ihre beste Option ist wahrscheinlich, eine separate, zustandslose Filterkette für den ReST-Teil zu definieren. Die Formularanmeldungskonfiguration verarbeitet keinen Basisauthentifizierungsheader. –

Antwort

2

ich mit Feder Sicherheit und Federverschluß REST-Anwendung gespielt haben und ich meine eigene MapCsrfTokenRepository, die ich anstelle von Standard verwendet HttpSessionCsrfTokenRepository.

Dann können Sie csrf für Ihre Erholung URIs mit

http.csrf().csrfTokenRepository(tokenRepository) 

Leitgedanke neue CSRF_TOKEN ermöglichen ist zurückzukehren, wenn Client-Zugriff /login Ressource mit GET, weil kein csrf Token für GET benötigt wird . Und dann muss der Client dieses Token bei den nächsten Anrufen verwenden.

Beispiel ist auf github

+0

Hallo bsmk. Also, wie macht es das beruhigend, wenn Sie das Token im Repository gespeichert haben? – Jaxox

+0

Es ist nicht vollständig erholsam. Das ist nur ein Kompromiss, ich bin mir nicht sicher, ob dies der richtige Ansatz ist, aber ich habe nichts anderes gefunden. – bsmk

Verwandte Themen