У меня есть 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