Я бы хотел использовать аутентификацию с моим приложением. Я использую приложение Spring MVC и Spring Security. Против браузера он работает нормально. Это означает, что я аутентифицирую пользователя в своем приложении и пользуюсь веб-страницей.Spring Security, Rest Authentication и CSRF
Теперь, я хочу использовать отдых. Я добавил на свой небезопасный метод контроллера @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;
}
Мои 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
EDIT I обновлен мой код с
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
EDIT 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);
В журнале веб-сервера, я получил сообщение об успехе (см UserDetails на "пользователь").
Теперь я хотел бы использовать проверку подлинности для доступа к другим URL («безопасный/профиль/view.json»)
Как сохранить аутентификацию?
Спасибо
аутентификации на основе форм не является хорошим выбором, если вы не имеете интерактивный вход в систему (и, возможно, не сессии). Вместо этого попробуйте использовать что-то вроде базовой проверки подлинности. –
У меня есть интерактивный логин, потому что у меня есть веб-сайт для управления пользователями и много вещей, сделанных администраторами. –
Да, но, вероятно, это отдельная проблема из ReST API, о которой вы говорите в этом вопросе? Ваш лучший вариант, вероятно, состоит в том, чтобы определить отдельную цепочку фильтров без состояния для части ReST. Конфигурация входа в форму не будет обрабатывать основной заголовок проверки подлинности. –