2016-09-15 9 views
0

私はSpring 4とjava configs(xmlファイルなし)を使用してRESTアプリケーションを構築しています。ここでSpringセキュリティレストークン認証 - フィルタが実行されない

いくつかの実際のコード:そのほかに

public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { 

    @Override 
    protected String[] getServletMappings() { 
     return new String[]{"/"}; 
    } 

    @Override 
    protected Class<?>[] getRootConfigClasses() { 
     return new Class<?>[] {ApplicationConfig.class}; 
    } 

    @Override 
    protected Class<?>[] getServletConfigClasses() { 
     return null; 
    } 
} 

私はトークン認証を使用するWebサービスを確保していますので、私はトークンに対処し、適切に彼のトークンによってユーザーを取得し、ユーザーを置くためにフィルターを持っていますオブジェクトをSecuriryContextに追加します。ここFilterのいくつかのコードです:

@Component 
public class AuthenticationTokenFilter extends UsernamePasswordAuthenticationFilter { 

private String tokenHeader = "X-Auth-Token"; 

@Autowired 
private TokenUtils tokenUtils; 

@Autowired 
private UserDetailsService userDetailsService; 

@Override 
@Autowired 
public void setAuthenticationManager(AuthenticationManager authenticationManager) { 
    super.setAuthenticationManager(authenticationManager); 
} 

@Override 
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 

    HttpServletRequest httpRequest = (HttpServletRequest) request; 
    String authToken = httpRequest.getHeader(this.tokenHeader); 
    String username = this.tokenUtils.getUsernameFromToken(authToken); 

    if (username != null && SecurityContextHolder.getContext().getAuthentication() == null) { 
     UserDetails userDetails = this.userDetailsService.loadUserByUsername(username); 
     if (this.tokenUtils.validateToken(authToken, userDetails)) { 
      UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities()); 
      authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(httpRequest)); 
      SecurityContextHolder.getContext().setAuthentication(authentication); 
     } 
    } 

    chain.doFilter(request, response); 
} 

} 

私は春のセキュリティを使用していますが、ここで私のWebSecurityConfigurerAdapter

@Configuration 
@EnableWebSecurity 
@EnableGlobalMethodSecurity(prePostEnabled = true) 
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter { 

    @Autowired 
    private EntryPointUnauthorizedHandler unauthorizedHandler; 

    @Autowired 
    private AuthenticationTokenFilter authTokenFilter; 


    @Bean 
    public PasswordEncoder passwordEncoder() { 
    return new BCryptPasswordEncoder(); 
    } 

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


    @Override 
    protected void configure(HttpSecurity httpSecurity) throws Exception { 
    httpSecurity 
     .csrf() 
     .disable() 
     .exceptionHandling() 
     .authenticationEntryPoint(this.unauthorizedHandler) 
     .and() 
     .sessionManagement() 
     .sessionCreationPolicy(SessionCreationPolicy.STATELESS) 
     .and() 
     .authorizeRequests() 
     .antMatchers(HttpMethod.OPTIONS, "/**").permitAll() 
     .antMatchers("/auth/**").permitAll()  
     .anyRequest().authenticated(); 

     httpSecurity 
     .addFilterBefore(authTokenFilter, UsernamePasswordAuthenticationFilter.class); 
    } 

} 

私の問題は、フィルタのdoFilter()が実行されないということです。どんな助け?

PS:SpringBootの使用はオプションではありません。私は春のブート自動設定を使用せずにそれをしたいです。

答えて

1

あなたはコンポーネントとしてではなく、単純なオブジェクトのようにフィルタを追加します。これは、Springについて何も知らないServletContextのどこかでリフレクションによって作成されます。 あなたは春のセキュリティ

@EnableWebSecurity 
@Configuration 
public class SecurityConfig extends WebSecurityConfigurerAdapter { 

    @Autowired 
    private YourFilter yourFilter; 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http 
      .addFilterBefore(yourFilter, UsernamePasswordAuthenticationFilter.class); 
    } 
} 
+0

を使用する場合、セキュリティの設定でSpringSecurityFilterChainにフィルタあなたを追加することができますし、春のセキュリティを使用しない場合は、責任のチェーンとして、いくつかのフィルタを作成したいし、それへのあなたの豆-フィルタを追加することができます –

+0

フィルターから@Componentアノテーションを削除する必要がありますか? –

+0

フィルタをBeanとして使用し、そのフィールドをAutowiredにしたい場合は、@Component of course =)のように注釈する必要があります。 –

関連する問題