text: package com.beautifulsoup.chengfeng.security.configurer;
  
  import com.beautifulsoup.chengfeng.filter.TokenAuthenticationFilter;
  import com.beautifulsoup.chengfeng.handler.TokenRefreshFailureHandler;
  import org.springframework.security.authentication.AuthenticationManager;
  import org.springframework.security.config.annotation.web.HttpSecurityBuilder;
  import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
  import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
  import org.springframework.security.web.authentication.logout.LogoutFilter;
  
  public class TokenLoginConfigurer<T extends TokenLoginConfigurer<T, B>, B extends HttpSecurityBuilder<B>> extends AbstractHttpConfigurer<T, B> {
      
  	private TokenAuthenticationFilter authFilter;
  	
  	public TokenLoginConfigurer() {
  		this.authFilter = new TokenAuthenticationFilter();
  	}
  	
  	@Override
  	public void configure(B http) throws Exception {
  		authFilter.setAuthenticationManager(http.getSharedObject(AuthenticationManager.class));
  		authFilter.setAuthenticationFailureHandler(new TokenRefreshFailureHandler());
  
  		TokenAuthenticationFilter filter = postProcess(authFilter);
  		http.addFilterBefore(filter, LogoutFilter.class);
  	}
  	
  	public TokenLoginConfigurer<T, B> permissiveRequestUrls(String ... urls){
  		authFilter.setPermissiveUrl(urls);
  		return this;
  	}
  	
  	public TokenLoginConfigurer<T, B> tokenValidSuccessHandler(AuthenticationSuccessHandler successHandler){
  		authFilter.setAuthenticationSuccessHandler(successHandler);
  		return this;
  	}
  	
  }
  