public class SecurityConfig extends WebSecurityConfigurerAdapter {
private final JwtTokenProvider provider;
private final JwtTokenFilter filter;
private AuthenticationEntryPoint entryPoint;
private static final String LOGIN_ENDPOINT = "/app/regular";
private static final String ADMIN_ENDPOINT = "/app/admin";
@Autowired
public SecurityConfig(JwtTokenProvider provider, JwtTokenFilter filter, AuthenticationEntryPoint entryPoint) {
this.provider = provider;
this.filter = filter;
this.entryPoint = entryPoint;
}
@Bean
@Override
public AuthenticationManager authenticationManagerBean() throws Exception {
return super.authenticationManagerBean();
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.httpBasic().disable()
.csrf().disable()
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.authorizeRequests()
.anyRequest().hasAnyAuthority("regular")
.and()
.apply(new JwtConfigurer(provider));
}
}
Это мой конфиг, который я нарезал в течение достаточного количества времени, что означало, что я пробовал много разных вариантов, чтобы решить мою проблему. Дело в том, что когда я использую почтальон с аутентификацией basi c, используя правильное имя пользователя и пароль, POST, PUT, DELETE (PPD) возвращает мне 401. Но когда я использую метод Get, а затем использую PPD, он отвечает 403. Я думаю, та весенняя безопасность просто блокирует для меня PPD еще до входа в систему. Вот также JWTProveder:
@Component
public class JwtProvider {
@Value("${jwt.token.secret}")
private String secret;
@Value("${jwt.token.expired}")
private long validityInMilliseconds;
@Autowired
private UserDetailsService userDetailsService;
@PostConstruct
protected void init(){secret = Base64.getEncoder().encodeToString(secret.getBytes());}
public String createToken(String username, String access){
Claims claims = Jwts.claims().setSubject(username);
claims.put("access", access);
Date now = new Date();
Date validity = new Date(now.getTime() + validityInMilliseconds);
return Jwts.builder().setClaims(claims).setIssuedAt(now).setExpiration(validity).signWith(SignatureAlgorithm.HS256, secret).compact();
}
public String resolveToken(HttpServletRequest req) {
String bearerToken = req.getHeader("Authorization");
if(bearerToken !=null && bearerToken.startsWith("Bearer")){
return bearerToken.substring(7, bearerToken.length());
}
return null;
}
public boolean validateToken(String token) {
try{
Jws<Claims> claims = Jwts.parser().setSigningKey(secret).parseClaimsJws(token);
if(claims.getBody().getExpiration().before(new Date())){
return false;
}
return true;
} catch(JwtException | IllegalArgumentException e){
throw new JwtAuthenticationException("Jwt token is expired or invalid");
}
}
public Authentication getAuthentication(String token) {
UserDetails userDetails = this.userDetailsService.loadUserByUsername(getUsername(token));
return new UsernamePasswordAuthenticationToken(userDetails, "", userDetails.getAuthorities());
}
private String getUsername(String token) {
return Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody().getSubject();
}
}
Я пытаюсь решить в течение недели. Пожалуйста, помогите.