我想在我的应用程序中使用身份验证。 我有一个Spring MVC应用程序和Spring Security应用程序。对浏览器,它工作正常。 这意味着,我向我的应用程序验证用户并使用网页。
现在,我想休息一下。我添加了不安全的控制器方法@ResponseBody,我在json中收到响应。 但是如何使用RestTemplate用户和密码连接到我的应用程序?
我在RestClient中的代码是(用于测试):
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;
}
My 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();
}
结果是:访问被拒绝。 我想问题来自restTemplate的身份验证,但我如何进行身份验证呢?
我的第二个问题是关于csrf谁被禁用但我想启用它(我的表单使用它)
我正在使用Spring 4.0和Spring Security 3.2
修改 的 我用
更新了我的代码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);
我收到了代码302
编辑18022014 - 16:46 我更新到了
String url = articleServiceUrl + "login?username=user&password=userpassword";
HttpEntity entity restTemplate;exchange(url, HTTPMethod.POST,null, HttpEntity.class)
system.out.println(entity);
在Web服务器的日志中,我收到了一条成功消息(请参阅“user”的userdetails)。
现在,我想使用身份验证来访问其他网址(“secure / profile / view.json”)
如何保持身份验证?
谢谢
答案 0 :(得分:2)
我一直在使用spring security和spring boot REST应用程序,我创建了自己的 MapCsrfTokenRepository ,而不是默认 HttpSessionCsrfTokenRepository 。
然后,您可以使用
为其余URI启用csrfhttp.csrf().csrfTokenRepository(tokenRepository)
主要思想是当客户端使用 GET 访问 / login 资源时返回新的CSRF_TOKEN,因为GET不需要csrf令牌。然后客户端必须在下次调用中使用此令牌。
示例在github
上