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());
}
}
당신은 JWTLoginFilter에서 일부 코드를 게시 할 수 있습니까? 나는 그것이 @filter로 주석 처리 된 것으로 의심하고, 모든 요청에 묶여있다. 그걸 제거하고 싶을 수도 있습니다. – Sarief
질문을 업데이트하고'JWTLoginFilter'에 대한 코드를 포함 시켰습니다. 내 코드에는 @filter 주석이 없습니다. 분명히, 모든 요청에 묶여 있습니다. –
내 제안은 로그인 필터를 제거하고 아직 있는지 확인하는 것입니다. 또한 JWTAuthenticationFilter가 모든 곳에서 사용되므로 로그인 필터 또는 smth를 확장하는지 확인하십시오. – Sarief