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
aktualisiertString 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
aktualisiertString 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
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. –
Ich habe ein interaktives Login, weil ich eine Website habe, um Benutzer und viele Dinge zu verwalten, die von Admins gemacht wurden. –
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. –