2016-11-20 10 views
0

私はトークンベースの認証 を持っています。認証が済んだら、トークンを得た後、手動でトークンなしでサーバーにコールを送信しようとしました。トークンがサーバーに送信されなかったとき、許可の何らかの形で適切なデータは、SecurityContextHolderであり、それはそこに現れたのか分からないように私には、データを取得する、とそう私はここでSTATELESSセッショントークンベースの認証SecurityContextHolderがnullでない場合があります

を使用し、私の設定です:

public class WebSecurityConfig extends WebSecurityConfigurerAdapter { 

    @Autowired 
    private UserDetailsService userDetailsService; 

    @Autowired 
    private AuthenticationEntryPoint authenticationEntryPoint; 

    @Autowired 
    private AccessDeniedHandler accessDeniedHandler; 

    @Autowired 
    public void configureAuthentication(AuthenticationManagerBuilder authenticationManagerBuilder) throws Exception { 
     authenticationManagerBuilder 
       .userDetailsService(this.userDetailsService) 
       .passwordEncoder(passwordEncoder()); 
    } 

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

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

    @Bean 
    public AuthenticationTokenFilter authenticationTokenFilterBean() throws Exception{ 
     AuthenticationTokenFilter authenticationTokenFilter = new AuthenticationTokenFilter(); 
     authenticationTokenFilter.setAuthenticationManager(authenticationManagerBean()); 
     return authenticationTokenFilter; 
    } 

    @Override 
    protected void configure(HttpSecurity httpSecurity) throws Exception { 
     httpSecurity 
       .csrf() 
       .disable() 
       .httpBasic().disable() 
       .addFilterBefore(authenticationTokenFilterBean(), UsernamePasswordAuthenticationFilter.class) 
       .sessionManagement() 
        .sessionCreationPolicy(SessionCreationPolicy.STATELESS) 
       .and() 
       .exceptionHandling() 
        .authenticationEntryPoint(authenticationEntryPoint) 
        .accessDeniedHandler(accessDeniedHandler) 
       .and() 
       .authorizeRequests() 
        .antMatchers(HttpMethod.OPTIONS, "/**").permitAll() 
        .antMatchers("/**").permitAll() 
        .antMatchers("/auth/**").permitAll() 
       .anyRequest().authenticated(); 
    } 
} 

AuthenticationTokenFilter

public class AuthenticationTokenFilter extends UsernamePasswordAuthenticationFilter { 
    @Autowired 
    private TokenUtils tokenUtils; 

    @Autowired 
    private UserDetailsService userDetailsService; 

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

     tokenUtils = WebApplicationContextUtils 
       .getRequiredWebApplicationContext(this.getServletContext()) 
       .getBean(TokenUtils.class); 
     userDetailsService = WebApplicationContextUtils 
       .getRequiredWebApplicationContext(this.getServletContext()) 
       .getBean(UserDetailsService.class); 


     HttpServletResponse resp = (HttpServletResponse) response; 
     resp.setHeader("Access-Control-Allow-Origin", "*"); 
     resp.setHeader("Access-Control-Allow-Methods", "POST, GET, PUT, OPTIONS, DELETE, PATCH"); 
     resp.setHeader("Access-Control-Max-Age", "3600"); 
     resp.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, " + Constants.tokenHeader); 


     HttpServletRequest httpRequest = (HttpServletRequest) request; 
     String authToken = httpRequest.getHeader(Constants.tokenHeader); 

     Authentication auth = SecurityContextHolder.getContext().getAuthentication(); 
     if(authToken != null){ 
      String username = this.tokenUtils.getUsernameFromToken(authToken); 
      if (username != null && auth == 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); 
    } 
} 

答えて

関連する問題