2017-05-05 7 views
-2

私はJWTでスプリングブートとセキュリティを設定しましたが、すべてがしばらくの間不思議でした。スプリングブート+セキュリティ+ JWTはトークンを生成できません

これは最初のルート "/ユーザ/ cadastrarは" 正常に動作します私のwebSecurityConfig

httpSecurity 
      .csrf().disable() 
      .exceptionHandling().authenticationEntryPoint(unauthorizedHandler).and() 
      .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and() 
      .authorizeRequests() 
      .antMatchers(HttpMethod.POST, "/user/cadastrar/**").permitAll() 
      .antMatchers(HttpMethod.POST, "/auth/**").permitAll() 
      .anyRequest().authenticated(); 
    httpSecurity 
      .addFilterBefore(authenticationTokenFilterBean(), UsernamePasswordAuthenticationFilter.class); 
    httpSecurity.headers().cacheControl(); 

です。

問題は、私の2番目のルート「/ AUTH」 通話/それは私のJwtAuthenticationTokenFilterクラスでこの機能に着陸する予定身体上のユーザ名とパスワードを使用して認証が続い

protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws ServletException, IOException { 
    String authToken = request.getHeader(this.tokenHeader); 
    String username = jwtTokenUtil.getUsernameFromToken(authToken); 
    logger.info("checking authentication for user " + username); 
    if (username != null && SecurityContextHolder.getContext().getAuthentication() == null) { 
     UserDetails userDetails = this.userDetailsService.loadUserByUsername(username); 
     if (jwtTokenUtil.validateToken(authToken, userDetails)) { 
      UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities()); 
      authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request)); 
      logger.info("authenticated user " + username + ", setting security context"); 
      SecurityContextHolder.getContext().setAuthentication(authentication); 
     } 
    } 
    chain.doFilter(request, response); 
} 

それは私のAuthenticationControllerクラスに行くです

:問題は、このコードの特定の部分のようです。この機能

@RequestMapping(value = "${jwt.route.authentication.path}", method = RequestMethod.POST) 
public ResponseEntity<?> createAuthenticationToken(@RequestBody JwtAuthenticationRequest authenticationRequest, Device device) throws AuthenticationException { 

    // Perform the security 
    final Authentication authentication = authenticationManager.authenticate(
      new UsernamePasswordAuthenticationToken(
        authenticationRequest.getUsername(), 
        authenticationRequest.getPassword() 
      ) 
    ); 
    SecurityContextHolder.getContext().setAuthentication(authentication); 

    // Reload password post-security so we can generate token 
    final UserDetails userDetails = userDetailsService.loadUserByUsername(authenticationRequest.getUsername()); 
    final String token = jwtTokenUtil.generateToken(userDetails, device); 

    // Return the token 
    return ResponseEntity.ok(new JwtAuthenticationResponse(token)); 
} 

を実行します

オブジェクト "UserNamePasswordAuthenticationToken"を返そうとすると、関数 "doFilterInternal"の最後に、 "chain.doFilter"コールの後の括弧だけにブレークポイントが送信されます。

答えて

0

問題は解決しました。明らかに16時間連続してコーディングすると、あなたの考え方に影響を与えます。

上記のコードに何も問題はありません。何らかの理由で、新しく作成されたユーザーをデフォルトで無効に設定していました。

関連する問題