Почему при добавлении @PreAuthorize я получаю сообщение 400 Bad Request вместо 403?JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Почему при добавлении @PreAuthorize я получаю сообщение 400 Bad Request вместо 403?

Сообщение Anonymous »

У меня есть API bookUpdate(), и он работает нормально. Но недавно я добавил роль к моему пользователю и @PreAuthorize, а затем к моему методу контроллера и @EnableMethodSecurity к моему SecurityConfig:
@PreAuthorize("hasRole('ADMIN')")
@PutMapping("/{id}")
public ResponseEntity updateBook(@PathVariable Long id, @RequestBody BookRequest request) {
return ResponseEntity.ok(bookService.updateBook(id,request));
}

Я ожидал 403, но в итоге получил 400 неверный запрос. Я сейчас в таком замешательстве и не знаю, где я это напортачил. Что на самом деле делает аннотация @PreAuthorize и какой момент мне нужно проверить?
Вот мой класс JwtFilter, Role и User:
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
String authHeader = request.getHeader("Authorization");
String token = null;
String username = null;

if (authHeader != null && authHeader.startsWith("Bearer ")) {
token = authHeader.substring(7);
username = jwtService.extractUsername(token);
}

if (username != null && SecurityContextHolder.getContext().getAuthentication() == null) {

UserDetails userDetails = context.getBean(MyUserDetailsService.class).loadUserByUsername(username);

if (jwtService.validate(token, userDetails)) {

List roles = jwtService.extractRoles(token);

List authorities = roles.stream()
.map(SimpleGrantedAuthority::new)
.toList();

UsernamePasswordAuthenticationToken authToken =
new UsernamePasswordAuthenticationToken(userDetails, null, authorities);
authToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
SecurityContextHolder.getContext().setAuthentication(authToken);

}
}
if (filterChain != null) {
filterChain.doFilter(request, response);
}
}

@Data
public class User {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String email;
@Column(unique = true, nullable = false)
private String username;
private String password;

@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(
name = "user_roles",
joinColumns = @JoinColumn(name = "user_id"),
inverseJoinColumns = @JoinColumn(name = "role_id")
)
private Set roles = new HashSet();
}


Подробнее здесь: https://stackoverflow.com/questions/798 ... eauthorize
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»