2017-02-22 16 views
-1

Я пытаюсь защитить мои REST веб-служб на URL/диспетчерский/отдыха/**Как обезопасить веб-службы REST с помощью Spring Security

Мой текущий дизайн отлично работает, если доступ к веб-сервиса через браузер - когда Я пытаюсь перейти к URL-адресу REST, он перенаправляет меня на страницу входа в систему, чтобы ввести учетные данные, а затем перенаправляет меня на данные веб-службы после входа в систему.

Проблема в том, что при попытке доступа к веб-сервису через код Java используя RestTemplate, мой код прерывается. Это происходит, даже если пользователь уже зарегистрировался и прошел проверку подлинности.

Моя весна-security.xml конфигурационный файл:

<beans:beans xmlns="http://www.springframework.org/schema/security" 
    xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
    http://www.springframework.org/schema/security 
    http://www.springframework.org/schema/security/spring-security-3.2.xsd"> 

    <!-- enable use-expressions --> 
    <http auto-config="true" use-expressions="true"> 
     <intercept-url pattern="/dispatcher/admin**" access="hasRole('ROLE_ADMIN')" /> 
<intercept-url pattern="/dispatcher/rest/**" access="hasRole('ROLE_ADMIN')"/> 
     <!-- access denied page --> 
     <access-denied-handler error-page="/dispatcher/403" /> 
     <form-login 

      login-page="/dispatcher/login" 
      default-target-url="/dispatcher/admin" 
      login-processing-url="/dispatcher/login_process" 
      authentication-failure-url="/dispatcher/login?error" 
      username-parameter="username" 
      password-parameter="password" /> 
     <logout logout-success-url="/dispatcher/login?logout" logout-url = "/dispatcher/logout"/> 
     <!-- enable csrf protection --> 
     <csrf /> 
     </http> 

    <authentication-manager> 
     <authentication-provider user-service-ref="myUserDetailsService" > 

     </authentication-provider> 
    </authentication-manager> 
<beans:bean id="myUserDetailsService" class="com.shopping.services.MyUserDetailsService" /> 
</beans:beans> 

Любая помощь будет принята с благодарностью!

+0

описать «когда я пытаюсь получить доступ к веб-сервиса с помощью Java-код с помощью RestTemplate, мой код разрывы». Попытайтесь изолировать, где проблема, либо ваш наружный код 'RestTemplate' сломан, либо безопасность. В первом случае вы также должны отправить код, который вы использовали для вызова вашего защищенного API. – g00glen00b

+0

Очень редко используется служба REST, защищенная регистрацией формы - вы уверены, что это то, что вы хотите? Традиционно вы использовали бы базовую аутентификацию вместо входа в систему, или если услуги вызываются от имени конечного пользователя, вы можете использовать OAuth2. –

ответ

0

Решение, которое я нашел, чтобы получить доступ к веб-сервиса заключается в следующем:

String username = ((UserDetails) principal).getUsername(); 
     String password = ((UserDetails) principal).getPassword(); 
     HttpClient client = new HttpClient(); 
     client.getParams().setAuthenticationPreemptive(true); 
     Credentials defaultcreds = new UsernamePasswordCredentials(username, password); 
     restTemplate.setRequestFactory(new CommonsClientHttpRequestFactory(client)); 
     client.getState().setCredentials(AuthScope.ANY, defaultcreds); 
     User x = restTemplate.getForObject("http://localhost:8080/Online_Shopping/dispatcher/rest/hello",User.class); 
Смежные вопросы