403 за каждый запрос PUT, POST, DELETE в Spring Security / jwt - PullRequest
0 голосов
/ 30 марта 2020
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();
}
}

Я пытаюсь решить в течение недели. Пожалуйста, помогите.

...