2016-07-19 15 views
0

Meine AngularJS-Anwendung verfügt über eine Schaltfläche zum Anmelden und Abmelden. Der Login-Button funktioniert einwandfrei und auch alle anderen Anfragen, die an mein Backend gesendet werden.Spring Security/Logout funktioniert nicht Cross-Ursprungsanforderungen

Das Problem tritt auf, wenn ich versuche, mich abzumelden.

Ich bekomme folgenden Fehler.

XMLHttpRequest cannot load http://localhost:8081/logout. The request wasredirected to 'http://localhost:8081/login?logout', which is disallowed forcross-origin requests that require preflight.

Hier ist mein Code:

'use strict'; 
angular.module('emifEkolFinderApp').controller('logoutController', ['$scope', 'CONFIGURATION', 'AccessToken', '$http', '$location', function ($scope, CONFIGURATION, AccessToken, $http, $location) { 
    $scope.logout = function() { 
     var userUrl = 'http://' + CONFIGURATION.OAUTH_SERVER_IP_AND_PORT + '/logout'; 
     var data = AccessToken.set().access_token; 
     $http.post(userUrl,JSON.stringify("{}")).then(function (successCallback) { 
      AccessToken.destroy(); 
      console.log("Revokin'"); 
      $location.path("/"); 
     }, function (errorCallback) { 
      console.log(errorCallback); 
     }); 
    }; 
}]); 

Frühling Sicherheit config:

@Configuration 
public class ServerSecurityConfig extends WebSecurityConfigurerAdapter { 

    @Autowired 
    private UserDetailsService userDetailsService; 

    @Autowired 
    private AuthenticationManager authenticationManager; 

    @Override 
    protected void configure(final AuthenticationManagerBuilder auth) 
      throws Exception { 
     auth.parentAuthenticationManager(authenticationManager).userDetailsService(userDetailsService); 
    } 

    @Override 
    @Bean 
    public AuthenticationManager authenticationManagerBean() throws Exception { 
     return super.authenticationManagerBean(); 
    } 

    @Override 
protected void configure(HttpSecurity http) throws Exception { 
    http.authorizeRequests() 
      .antMatchers("/resources/**").permitAll() 
      .antMatchers("/login").permitAll() 
      .antMatchers("/logout").permitAll() 
      .anyRequest().authenticated() 
      .and() 
      .csrf().disable() 
      .formLogin() 
      .loginPage("/login").permitAll() 
      .and() 
      .httpBasic() 
      .and() 
      .logout() 
      .permitAll() 
      .deleteCookies("JSESSIONID") 
      .invalidateHttpSession(true); 
} 

} 

mein CORS Filter:

@Component 
@Order(Ordered.HIGHEST_PRECEDENCE) 
public class SimpleCorsFilter extends OncePerRequestFilter { 

    @Override 
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { 
     response.setHeader("Access-Control-Allow-Origin", "*"); 
     response.setHeader("Access-Control-Allow-Methods", "POST, GET, PUT, OPTIONS, DELETE, HEAD"); 
     response.setHeader("Access-Control-Max-Age", "3600"); 
     response.setHeader("Access-Control-Allow-Headers", "x-requested-with, authorization, cache-control, content-type, Origin, key"); 
     response.setHeader("Content-Type", "*"); 
     if ("OPTIONS".equalsIgnoreCase(request.getMethod())) { 
      response.setStatus(HttpServletResponse.SC_OK); 
     } else { 
      filterChain.doFilter(request, response); 
     } 
    } 
} 

Ich berühre mich wirklich im Dunkeln. Hilfe wäre sehr willkommen.

Antwort

2

Ich denke, Ihr Problem dies mit der Umleitung nach dem Abmelden verwandt ist, versuchen Sie diese Umleitung deaktivieren, indem Sie einen LogoutSuccessHandler Umsetzung wie die Frage: Spring security - Disable logout redirect

http.logout().logoutSuccessHandler((new HttpStatusReturningLogoutSuccessHandler (HttpStatus.OK)));

0

Well Spring Security Standardverhalten für Abmeldung ist dass es nach erfolgreicher Abmeldung die Anfrage an die default logout succes url umleitet, die standardmäßig /login?logout ist.

Dies ist eine Redirect-Aktion und während der Verwendung von Restanrufen sind Redirect nicht zulässig. Daher bricht Ihr Logout-Code. Sie müssen einen benutzerdefinierten Logout-Handler hinzufügen, der Sie nicht zu einem anderen Pfad weiterleitet.

Und wie that.Create einen benutzerdefinierten Logout-Handler zu tun und Antwort von dort so etwas wie

http.formLogin().and().logout().addLogoutHandler(new LogoutHandler() { 
      @Override 
      public void logout(HttpServletRequest request, HttpServletResponse response, Authentication authentication) { 
       response.setStatus(HttpServletResponse.SC_OK); 
      } 
     }); 
senden