2017-04-23 5 views
0

私のSpring起動アプリケーションには、次のWebセキュリティ設定があります。Spring起動アプリケーションでのLogout Rest APIの実装

@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要求を行うと、サーバーが例外をスロー:

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でメソッドを実行しようとしますしかし、なぜですか? JWTLoginFilter.javaため

編集1

コード:

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); }

関連する問題