В конфигурации безопасности:
Код: Выделить всё
@Bean
public SecurityFilterChain configuration(HttpSecurity http) throws Exception {
http.csrf(AbstractHttpConfigurer::disable);
http.authorizeHttpRequests(Registry -> Registry
.requestMatchers(Constants.PUBLIC_URL)// /auth/**
.permitAll()
.requestMatchers(Constants.AUTHENTICATE_URL)// /api/**
.hasAnyRole(Role.ADMIN.name(), Role.USER.name())
);
http.sessionManagement(session
-> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS));
http.authenticationProvider(authenticationProvider());
return http.build();
}
Код: Выделить всё
@PostMapping("/authenticate")
public String processAuthenticate(@Valid @ModelAttribute(name = "user") AuthenticateRequest authenticateRequest, BindingResult bindingResult) {
bindingResult = authServices.authenticate(authenticateRequest, bindingResult);
if (bindingResult.hasErrors()) {
return "authenticate";
}
SecurityContextHolder.getContext().setAuthentication(
new UsernamePasswordAuthenticationToken(
authenticateRequest.getUsername(),
authenticateRequest.getPassword()
)
);
return "redirect:/api/home";
}
если authServices.authenticate(authenticateRequest,bindingResult); не выдает никаких исключений, что означает правильное имя пользователя и пароль
Далее SecurityContextHolder установит аутентификацию (UsernamePasswordAuthentication) и заполнит ее именем пользователя и паролем.
Наконец, отправьте перенаправление на URL-адрес «/api/home».
Определены две роли: ПОЛЬЗОВАТЕЛЬ и АДМИН.
Код: Выделить всё
public enum Role {
USER(Collections.emptySet()),
ADMIN(Set.of(ADMIN_READ,
ADMIN_UPDATE, ADMIN_CREATE, ADMIN_DELETE
));
@Getter
private final Set
permissions;
public List getAuthorities() {
List authorities = new java.util.ArrayList(getPermissions().stream()
.map(permission -> new SimpleGrantedAuthority(permission.getPermission()))
.toList());
authorities.add(new SimpleGrantedAuthority("ROLE_" + this.name()));
return authorities;
}
}
Кроме того, на веб-странице не выбрасывается исключение AccessDeniedException, только ошибка Http 403.
Это моя таблица Mysql:
'1', 'user1', '$2a $10$faQJhWWffJlvWbN4YDC4tep4TIMDzH3Hse4tH9MMmt6r9NKp49FCe', 'user1@qq.com', 'ADMIN'
'5', 'user2', '$2a$10$qAZAuvoG.aaEMljYfQirZOhjEUsUZ3edcum/Mhc6UPOc.ti 0VD7JO', ' user2@qq.com', 'USER'
Я пробовал:
добавление @PreAuthorize("isAuthenticated()") на домашнюю страницу функцию контроллера, но не помогает.
и @Secured("ROLE_USER") тоже не помогает.
изменение столбца "USER" на "ROLE_USER" в таблице Mysql не помогает.
И я изменил .hasAnyRole(Role.ADMIN.name(), Role.USER.name()) на .hasAuthority("ADMIN"), на
Код: Выделить всё
.hasAuthority("USER")Чего я ожидал:
Просто скажите мне причину этой досадной проблемы. Я хотел бы успешно перенаправить на /api/home. Спасибо большое!
Подробнее здесь: https://stackoverflow.com/questions/770 ... edirects-t