2014-12-30 2 views
0

У меня есть приложение, которое будет развернуто в двух местах. Там будет один мастер и один раб. У меня есть требование, чтобы некоторые из запросов были удовлетворены подчиненными и другими мастерами.CORS проблема угловая и весенняя безопасность

Для этого я отправляю запрос на вход для успешного входа в систему для ведомого пользователя. Я могу добиться этого.

Моя проблема в том, что когда я пытаюсь получить доступ к любому ресурсу от master (запрашивать ресурс от ведущего, ведущего из подчиненного устройства) после входа в систему, он дает ошибку несанкционированного доступа (401).

Войти контроллер:

$http.post('j_spring_security_check', payload, config).success(function(data, textStatus, jqXHR, dataType) { 
        if ($scope.rememberme) { 
         var user = { 
          username: $scope.username, 
          password: $rootScope.encryptPass($scope.password, true), 
          rememberme: $scope.rememberme 
         }; 
         localStorage.setItem('user', JSON.stringify(user)); 
        } else { 
         localStorage.removeItem('user'); 
        } 
        $rootScope.pingServer(); 
        $rootScope.retrieveNotificationCount(); 
        $http.post('http://localhost:9090/context/j_spring_security_check',payload, config).success(function(data, textStatus, jqXHR, dataType) { 

         $rootScope.pingServer(); 
        }).error(function(data, status, headers, config) { 

        }); 
       }); 

app.js

rootapp.config(['$httpProvider', function(httpProvider) { 
      httpProvider.interceptors.push(['$rootScope', function($rootScope) { 
        return { 
         request: function(config) { 
          config.headers = config.headers||{}; 
          config.headers['withCredentials'] = true; 
          config.headers['useXDomain'] = true; 
          return config; 
         } 
        } 
       }]); 

Мой сервер имеет фильтр

@Singleton 
public class ResponseCorsFilter implements Filter { 
@Override 
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { 
     if (servletResponse instanceof HttpServletResponse) { 
      if (request.getMethod().equals("OPTION") || request.getMethod().equals("OPTIONS")) { 
       System.out.println("In Options"); 
       if (request.getServletPath().equals("/j_spring_security_check")) { 
        System.out.println("request path match"); 
        alteredResponse.setStatus(HttpServletResponse.SC_OK); 
        addHeadersFor200Response(alteredResponse); 
        return; 
       } 
      } 

      addHeadersFor200Response(alteredResponse); 
     } 
     filterChain.doFilter(servletRequest, servletResponse); 
    } 

    private void addHeadersFor200Response(HttpServletResponse response) { 
     response.addHeader("Access-Control-Allow-Origin", "*"); 
     response.addHeader("Access-Control-Allow-Credentials", "true"); 
     response.addHeader("Access-Control-Allow-Methods", "ACL, CANCELUPLOAD, CHECKIN, CHECKOUT, COPY, DELETE, GET, HEAD, LOCK, MKCALENDAR, MKCOL, MOVE, OPTIONS, POST, PROPFIND, PROPPATCH, PUT, REPORT, SEARCH, UNCHECKOUT, UNLOCK, UPDATE, VERSION-CONTROL"); 
     response.addHeader("Access-Control-Allow-Headers", "useXDomain, withCredentials, Overwrite, Destination, Content-Type, Depth, User-Agent, Translate, Range, Content-Range, Timeout, X-File-Size, X-Requested-With, If-Modified-Since, X-File-Name, Cache-Control, Location, Lock-Token, If"); 
     response.addHeader("Access-Control-Expose-Headers", "DAV, content-length, Allow"); 
     response.addHeader("Access-Control-Max-Age", "86400"); 

    } 
} 

я упускаю что-нибудь?

+0

Выполняете ли вы проверку подлинности на одном сервере, а затем пытаетесь сделать неавторизованные запросы другим? Если это так, то это не удивительно, что вы получаете 401. Ничего общего с CORS. –

+0

Я проверяю подлинность на обоих серверах. и его работа должным образом. Моя проблема заключается в том, что после проверки подлинности, когда я запрашиваю ресурс от master, я получаю 401. – sadhvaryu

+0

Нужно ли отправлять мои учетные данные с запросами, сделанными после первоначальной проверки подлинности? Если да, то как мне его отправить? – sadhvaryu

ответ

2

Вы неправильно устанавливаете withCredentials в качестве заголовка запроса. Это вариант XHR и должен присутствовать непосредственно на конфигурации:

config.withCredentials = true; 

Эта опция позволит печенье для ваших запросов. Ваши запросы смогут включать JSESSIONID, что позволяет сеансу HTTP, где Spring Security хранит информацию об аутентификации.

И как обсуждалось в чате (см. Комментарии к вопросу) - имейте в виду, что если оба сервера работают в одном домене, they will share cookies. Это может вызвать проблемы (отправка неправильного JSESSIONID), поэтому вам нужно получить доступ к этим серверам под другим именем хоста.

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