Я играл с Spring Security и пытался заставить JWTAuthorizationFilter работать для моих запросов, но хотя фильтр возвращает 403, запрещенных для запросов, если пользователь не вошел в систему, как ожидалось, запросвсе еще выполняется, когда этого не должно быть.
Например, если у меня есть метод для создания нового проекта, проект создается, и сервер возвращает 403, но ожидаемое поведение - 403, а проекта нет.создал.
Я использовал https://github.com/devdojobr/springboot-essentials/blob/master/src/main/java/br/com/devdojo/config/JWTAuthenticationFilter.java в качестве ссылки, но мне все еще не повезло.
По-моему, это проблема цепочки фильтров, но я не совсем уверен, как это может быть проблемой
Я прикрепил свой класс Filter и SecurityConfig ниже:
Будет полезна любая помощь или указатели.
JWTAuthorizationFilter.java
package uk.ac.qub.eeecs.csc3045.year1819.cs1.server.security;
import io.jsonwebtoken.Jwts;
import java.io.IOException;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.web.authentication.www.BasicAuthenticationFilter;
import org.springframework.stereotype.Component;
import uk.ac.qub.eeecs.csc3045.year1819.cs1.server.service.SpringUserDetailService;
@Component
public class JWTAuthorizationFilter extends BasicAuthenticationFilter {
@Value("${security.jwt.token.secret-key:secret-key}")
private String secretKey = "secret-key";
@Value("${security.jwt.token.expire-length:3600000}")
private long validityInMilliseconds = 3600000;
private final SpringUserDetailService springUserDetailService;
public JWTAuthorizationFilter(
AuthenticationManager authenticationManager, SpringUserDetailService springUserDetailService) {
super(authenticationManager);
this.springUserDetailService = springUserDetailService;
}
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response,
FilterChain chain) throws IOException, ServletException {
super.doFilterInternal(request, response, chain);
String header = request.getHeader("Authorization");
if (header == null || !header.startsWith("Bearer ")) {
chain.doFilter(request, response);
return;
}
UsernamePasswordAuthenticationToken authenticationToken = getAuthenticationToken(request);
SecurityContextHolder.getContext().setAuthentication(authenticationToken);
chain.doFilter(request,response);
}
private UsernamePasswordAuthenticationToken getAuthenticationToken(HttpServletRequest request) {
String token = request.getHeader("Authorization");
if (token != null) {
//parse token
String user = Jwts.parser()
.setSigningKey(secretKey)
.parseClaimsJws(token.replace("Bearer ", ""))
.getBody()
.getSubject();
UserDetails userDetails = springUserDetailService.loadUserByUsername(user);
if (user != null) {
return new UsernamePasswordAuthenticationToken(user, null, userDetails.getAuthorities());
}
return null;
}
return null;
}
}
SecurityConfig.java
package uk.ac.qub.eeecs.csc3045.year1819.cs1.server.config;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import uk.ac.qub.eeecs.csc3045.year1819.cs1.server.security.JWTAuthorizationFilter;
import uk.ac.qub.eeecs.csc3045.year1819.cs1.server.service.SpringUserDetailService;
/**
* Configuration settings for management of JWT.
*
* JWT Implementation adapted from @see <a href="https://jwt.io/</a>
*/
@Configuration
@EnableConfigurationProperties
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private SpringUserDetailService springUserDetailService;
@Override
@Bean
public AuthenticationManager authenticationManagerBean() throws Exception {
return super.authenticationManagerBean();
}
/**
* Configure settings for JWT.
*
* @param http Spring security builder.
* @throws Exception
*/
@Override
protected void configure(HttpSecurity http) throws Exception {
http.cors().and().csrf().disable().authorizeRequests()
.antMatchers("/v2/users/login").permitAll()
.anyRequest().authenticated()
.and()
.addFilter(new JWTAuthorizationFilter(authenticationManager(), springUserDetailService));
}
}