2017-04-23 1 views
0

스프링 부트 애플리케이션을 위해 다음과 같은 웹 보안 구성을 가지고 있습니다. 당신이 볼 수있는스프링 부트 애플리케이션에 로그 아웃 Rest API 구현하기

com.fasterxml.jackson.databind.JsonMappingException: No content to map due to end-of-input 
at [Source: [email protected]; line: 1, column: 0] 
    at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:270) ~[jackson-databind-2.8.7.jar:2.8.7] 
    at com.fasterxml.jackson.databind.ObjectMapper._initForReading(ObjectMapper.java:3838) ~[jackson-databind-2.8.7.jar:2.8.7] 
    at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3783) ~[jackson-databind-2.8.7.jar:2.8.7] 
    at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2908) ~[jackson-databind-2.8.7.jar:2.8.7] 
    at com.boot.myapp.config.security.JWTLoginFilter.attemptAuthentication(JWTLoginFilter.java:32) ~[classes/:na] 

, 그것은 로깅에 사용되는 JWTLoginFilter에서 메소드를 실행하려고 :

@EnableWebSecurity 
@Configuration 
class WebSecurityConfig extends WebSecurityConfigurerAdapter { 

    @Autowired 
    private AccountRepository accountRepository; 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http 
      .csrf().disable() 
      .authorizeRequests() 
       .antMatchers("/login").permitAll() 
      .and() 
      .authorizeRequests() 
       .antMatchers("/signup").permitAll() 
      .and() 
      .authorizeRequests() 
       .anyRequest().authenticated() 
      .and() 
       .logout().logoutUrl("/logout").invalidateHttpSession(true) 
      .and() 
      // We filter the api/signup requests 
      .addFilterBefore(
       new JWTSignupFilter("/signup", authenticationManager(), accountRepository), 
       UsernamePasswordAuthenticationFilter.class) 
      // We filter the api/login requests 
      .addFilterBefore(
       new JWTLoginFilter("/login", authenticationManager()), 
       UsernamePasswordAuthenticationFilter.class) 
      // And filter other requests to check the presence of JWT in 
      // header 
      .addFilterBefore(new JWTAuthenticationFilter(userDetailsServiceBean()), 
       UsernamePasswordAuthenticationFilter.class); 
    } 

    @Override 
    protected void configure(AuthenticationManagerBuilder auth) 
      throws Exception { 
     auth.userDetailsService(userDetailsServiceBean()); 
    } 

    @Override 
    public UserDetailsService userDetailsServiceBean() throws Exception { 
     return new CustomUserDetailsService(accountRepository); 
    } 
} 

클라이언트가 /logout 엔드 포인트에 POST 요청을 서버에서 예외가 발생합니다 안에, 왜? JWTLoginFilter.java에 대한

편집 한

코드 :

public class JWTLoginFilter extends AbstractAuthenticationProcessingFilter { 


    public JWTLoginFilter(String url, AuthenticationManager authManager) { 
     super(new AntPathRequestMatcher(url)); 
     setAuthenticationManager(authManager); 
    } 

    @Override 
    public Authentication attemptAuthentication(HttpServletRequest req, 
      HttpServletResponse res) throws AuthenticationException, 
      IOException, ServletException { 

     CustomUserDetails creds = new ObjectMapper().readValue(
       req.getInputStream(), CustomUserDetails.class); 

     return getAuthenticationManager().authenticate(
       new UsernamePasswordAuthenticationToken(creds.getUsername(), 
         creds.getPassword())); 
    } 

    @Override 
    protected void successfulAuthentication(HttpServletRequest req, 
      HttpServletResponse res, FilterChain chain, Authentication auth) { 
     TokenAuthenticationService.addAuthentication(res, auth.getName()); 
    } 
} 
+0

당신은 JWTLoginFilter에서 일부 코드를 게시 할 수 있습니까? 나는 그것이 @filter로 주석 처리 된 것으로 의심하고, 모든 요청에 ​​묶여있다. 그걸 제거하고 싶을 수도 있습니다. – Sarief

+0

질문을 업데이트하고'JWTLoginFilter'에 대한 코드를 포함 시켰습니다. 내 코드에는 @filter 주석이 없습니다. 분명히, 모든 요청에 ​​묶여 있습니다. –

+0

내 제안은 로그인 필터를 제거하고 아직 있는지 확인하는 것입니다. 또한 JWTAuthenticationFilter가 모든 곳에서 사용되므로 로그인 필터 또는 smth를 확장하는지 확인하십시오. – Sarief

답변

0

분명히, 봄 보안은 자동으로 로그인 필터를 활성화 login?logout에 로그 아웃을 리디렉션합니다. 우리는 다음에 로그인 필터 생성자를 변경할 수 있습니다

public JWTLoginFilter(String url, AuthenticationManager authManager) { super(new AntPathRequestMatcher(url, "POST")); setAuthenticationManager(authManager); }

관련 문제