2017-03-21 1 views
0

Mein Interceptor läuft in allen Anfragen außer bei der Anmeldung.HandlerInterceptorAdapter läuft nicht bei der Anmeldung mit Spring Security

Interceptor:

public class MultitenantHandler extends HandlerInterceptorAdapter { 

     private static final Logger log = LoggerFactory.getLogger(MultitenantHandler.class); 

     @Override 
     public boolean preHandle(HttpServletRequest req, HttpServletResponse res, Object handler){ 

      String origin = req.getHeader("Origin"); 
      log.debug("Origin: "+origin); 

      if (origin == null) { 
       origin = "localhost"; 
      } 

      int indexDot = origin.indexOf("."); 
      int indexDash = origin.indexOf("://") + 3; 

      String tenant = ""; 

      if (indexDot == -1) { 
       tenant = "experter"; 
       log.warn("Using default tenant"); 
       TenantContext.setCurrentTenant(tenant); 

      } else { 
       tenant = origin.substring(indexDash, indexDot); 
       log.info("Using tenant: " + tenant); 
       TenantContext.setCurrentTenant(tenant); 
      } 

      return true; 

     } 
} 

Auf WebMvcConfigurerAdapter melde ich mich auf diese Weise:

@Override 
    public void addInterceptors(InterceptorRegistry registry) { 
     registry.addInterceptor(new MultitenantHandler()); 
    } 

Es Config meine Sicherheit ist:

@Configuration 
@EnableWebSecurity 
@Profile({"development", "demo", "default"}) 
@EnableGlobalMethodSecurity(securedEnabled = true) 
public class SecurityConfig extends WebSecurityConfigurerAdapter { 

    private final Logger log = LoggerFactory.getLogger(SecurityConfig.class); 

    @Autowired 
    private CustomUserDetailsService customUserDetailsService; 
    @Autowired 
    private PasswordEncoder passwordEncoder; 

    @Autowired 
    private RESTAuthenticationEntryPoint authenticationEntryPoint; 

    @Autowired 
    private RESTLogoutSuccessHandler logoutSuccessHandler; 

    @Autowired 
    private JWTAuthenticationFailureHandler authenticationFailureHandler; 

    @Autowired 
    private JWTAuthenticationSuccessHandler authenticationSuccessHandler; 

    @Autowired 
    private StatelessAuthenticationFilter statelessAuthFilter; 

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

     http.csrf().disable() 
       .exceptionHandling().authenticationEntryPoint(authenticationEntryPoint); 

     http.formLogin().permitAll() 
       .successHandler(authenticationSuccessHandler) 
       .failureHandler(authenticationFailureHandler); 

     http.logout().permitAll() 
       .logoutSuccessHandler(logoutSuccessHandler); 

     http.addFilterBefore(statelessAuthFilter, UsernamePasswordAuthenticationFilter.class); 

     http.authorizeRequests() 
       .antMatchers(HttpMethod.OPTIONS, "/**").permitAll() 
       .antMatchers("/v2/api-docs").hasRole("ADMIN") 
       .antMatchers("/login").permitAll() 
       .antMatchers("/login/changePassword").permitAll() 
       .antMatchers("/user/image").permitAll() 
       .antMatchers("/social/login/facebook").permitAll() 
       .antMatchers("/actuator/**").hasRole("ADMIN") 
       .antMatchers("/admin/**").hasRole("ADMIN") 
       .antMatchers("/**").hasRole("USER"); 

     log.info("Configuration of http complete."); 
    } 

    @Autowired 
    public void configureGlobal(AuthenticationManagerBuilder auth) 
      throws Exception { 
     auth.userDetailsService(customUserDetailsService).passwordEncoder(passwordEncoder); 
    } 

Als ich /login die Abfangjäger fordern nicht ausgeführt wird, in anderen Anfragen auch nicht protokolliert der Interceptor normal arbeiten.

Ich muss den Interzeptor vor jeder Anfrage ausführen, weil ich die Datenbank entsprechend URL-Anfrage einstellen muss.

Wenn Sie weitere Informationen benötigen, bitte sagen Sie mir, dass ich hier posten kann.

+1

Spring Security wird mithilfe von Filtern implementiert, die vor dem 'DispatcherServlet' und allen Controllern/Handlern ausgeführt werden, die Sie haben. Also wird es natürlich nicht laufen. Implementieren Sie es mit einem Filter anstelle eines 'HandlerInterceptor'. –

+0

Danke deine Antwort @ M.Deinum. Aber sobald ich den Filter kenne, ändert sich das Verhalten dieser Methode nicht. Laut http://stackoverflow.com/a/35856496/2463802 "Filter eignet sich gut für Anforderungsinhalt und Ansicht Inhaltsbehandlung, wie Multipart-Formulare und GZIP-Komprimierung. Dies zeigt in der Regel, wenn man den Filter auf bestimmte Inhaltstypen zuordnen muss (zB Bilder) oder auf alle Anfragen. " –

+0

Ihr Verständnis von Filtern ist fehlerhaft. Was Sie erreichen wollen, erreichen Sie mit einem Handler Interceptor nicht, Sie müssen einen Filter verwenden. Ein Filter kann viel mehr als ein 'Handlerinterceptor'. Wie bereits erwähnt, wird Spring Security mit Filtern implementiert, und so ist ein' HandlerInterceptor' einfach keine Option. –

Antwort

-1

Wenn Sie das gleiche Problem haben, löste ich dieses Problem mit Filter als @ M.Deinum verdaut. Ich habe den gleichen Filter verwendet, mit dem ich das Authentifizierungstoken validiere.

Verwandte Themen