2014-02-18 11 views
5

Я бы хотел использовать аутентификацию с моим приложением. Я использую приложение 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»)

Как сохранить аутентификацию?

Спасибо

+0

аутентификации на основе форм не является хорошим выбором, если вы не имеете интерактивный вход в систему (и, возможно, не сессии). Вместо этого попробуйте использовать что-то вроде базовой проверки подлинности. –

+0

У меня есть интерактивный логин, потому что у меня есть веб-сайт для управления пользователями и много вещей, сделанных администраторами. –

+0

Да, но, вероятно, это отдельная проблема из ReST API, о которой вы говорите в этом вопросе? Ваш лучший вариант, вероятно, состоит в том, чтобы определить отдельную цепочку фильтров без состояния для части ReST. Конфигурация входа в форму не будет обрабатывать основной заголовок проверки подлинности. –

ответ

2

Я играл с применением REST весной безопасности и весной загрузки и я создал свой собственный MapCsrfTokenRepository, что я использовал вместо умолчанию HttpSessionCsrfTokenRepository.

Затем вы можете включить CSRF для отдыха URIs с

http.csrf().csrfTokenRepository(tokenRepository) 

Основная идея заключается в том, чтобы вернуть новый csrf_token, когда клиент доступа /Логин ресурс с GET, потому что маркер CSRF не требуется для GET , И тогда клиент должен использовать этот токен в следующих вызовах.

Пример на github

+0

Привет, bsmk. так как это делает его полезным, если вы сохранили токен в репозитории? – Jaxox

+0

Это не полностью Restful. Это просто компромисс, я не уверен, что это правильный подход, но я ничего не нашел. – bsmk

Смежные вопросы