2017-01-18 12 views
0

私はSpring Data REST WebアプリケーションをAngularJSで保護するためにSpring Securityを使用しています。Spring Security Cookieが最初に禁止されたリクエストの後にのみAngularに到着します

私SecurityConfigは次のように宣言されています:

@Override 
protected void configure(HttpSecurity http) throws Exception { 

    http 
    .httpBasic().and() 
    .authorizeRequests() 

    // public ressources 
    .antMatchers("/index.html", "/templates/public/**", "/js/**", "/").permitAll() 
    .antMatchers(HttpMethod.GET, "/api/security/user").permitAll() 
    .antMatchers("/api/**").hasAnyRole("ADMIN", "NORMALUSER") 

    .anyRequest().authenticated() 
    .and().exceptionHandling().authenticationEntryPoint(basicAuthenticationEntryPointHandler) 

    .and().logout().logoutUrl("/logout").logoutSuccessHandler(new HttpStatusReturningLogoutSuccessHandler()).deleteCookies("JSESSIONID").permitAll().and() 
    .csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()); 
} 

は、私は一般的に自分の目標に到達するためのthisリンクを追いました。

初めてログインすると、$cookies.get("XSRF-TOKEN")の角度要求はを返します。定義されていないのはです。データベースへのリクエストはすべてブロックされません。

しかし、ログアウトしてもう一度ログインすると、Cookieが返され、すべてのデータベースリクエストが許可されます。

そして、これはこれだけ毎秒ログイン、起こる:

  1. 未定義を
  2. クッキー
  3. 未定義
  4. クッキー
  5. 未定義

    ...

だから、私の構造に深く入り込むことなく私を助けることができる人がいることを願っていますが、必要ならば私はそうします。

ありがとうございます。

編集1:プロセスに関連して enter image description here

ここでは要求されている。私は私のCokieCsrfTokenRepository()loadToken()でトークンをロギングしていて、そこにすべてのトークンが表示されます。..

編集2:私はすべてのログインで呼んでいる私の角度サービス、:

function authenticationService($rootScope, $http, $location, $filter, $cookies){  
    function authenticate(credentials, callback) { 

     var headers = credentials ? {authorization : "Basic " 
      + btoa(credentials.username + ":" + credentials.password) 
     } : {}; 

     $http.get('api/security/user', {headers : headers}).success(function(data, status, get, header) { 
      if (data.name) { 
       $rootScope.authenticated = true; 
       $rootScope.session = data; 
       console.log($cookies.get("XSRF-TOKEN")) // -> returns every second login cookie 

      } else { 
       $rootScope.authenticated = false; 
       $rootScope.session = null; 
      } 

      console.log($rootScope.session) 

      callback && callback(); 
     }).error(function() { 
      $rootScope.authenticated = false; 

      callback && callback(); 
     }); 

    } 

    return { 
     authenticate: function(credentials){ 
      authenticate(credentials, function() { 
       if ($rootScope.authenticated == true) { 
        $rootScope.authenticationError = false; 

        if ($rootScope.session.principal.admin == true){ 
         $location.path("/admin/manage"); 
        } else{ 
         $location.path("/user"); 
        } 
       } else { 
        $rootScope.authenticationError = true; 

        $location.path("/login"); 
       } 
      }); 
     }, 
     // called by refreshing browser 
     checkLoggedIn: function(){ 
      authenticate(); 
     }, 

     logout: function(){ 
      $http.post('/logout', {})["finally"](function() { 
       $rootScope.authenticated = false; 
       $rootScope.session = null; 
       $location.path("/login"); 
      }); 
     } 
    }; 
} 

編集3:クッキーが未定義の場合、loadToken()のメソッドthisがブラウザからログアウトし、最初にログインした後にのみ呼び出されることになりました。それからトークンが表示され、私は再びログインしています。だから、何も私は認識し、最初の禁断のPOSTリクエスト(EDIT3で、それは/ログアウトだ)した後、トークンが私のテンプレートを到着したことを:しかし、すべての後に、第2のそれはまだ...素晴らしい作品

編集4を試していません。ブラウザを更新した後は、すべてのリクエストに対してCookieが送信されるため、すべてのリクエストが許可されます。しかし、これを修正する方法は?

答えて

-1

私のソリューション:

//WebSecurityConfigurerAdapter: 
@Override 
protected void configure(HttpSecurity http) throws Exception { 
    http 
    .... 
    .addFilterAfter(new CsrfCustomFilter(), CsrfFilter.class).and() 
    .csrf().csrfTokenRepository(csrfTokenRepository()); 
} 

private CsrfTokenRepository csrfTokenRepository() { 
    HttpSessionCsrfTokenRepository repository = new HttpSessionCsrfTokenRepository(); 
    repository.setHeaderName("X-XSRF-TOKEN"); 
    return repository; 
} 

public class CsrfCustomFilter extends OncePerRequestFilter{ 

    @Override 
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { 

     CsrfToken csrf = (CsrfToken) request.getAttribute(CsrfToken.class.getName()); 

     if (csrf != null) { 
      Cookie cookie = WebUtils.getCookie(request, "XSRF-TOKEN"); 
      String token = csrf.getToken(); 

      if (cookie==null || token!=null && !token.equals(cookie.getValue())) { 
       cookie = new Cookie("XSRF-TOKEN", token); 
       cookie.setPath("/"); 
       response.addCookie(cookie); 
      } 
     } 

     filterChain.doFilter(request, response); 
    } 
} 
関連する問題