В Spring Security после ввода правильного имени пользователя и пароля он перенаправляется на домашнюю страницу, но по-пр ⇐ JAVA

Программисты JAVA общаются здесь
Anonymous
В Spring Security после ввода правильного имени пользователя и пароля он перенаправляется на домашнюю страницу, но по-пр

Сообщение Anonymous »

Итак, я практиковал свои навыки Spring Boot + Spring Security.
В конфигурации безопасности:

Код: Выделить всё

@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;
}
}
Я думаю, что-то не так с властями, ролями или чем-то еще. Потому что, когда я удаляю .hasAnyRole(Role.ADMIN.name(), Role.USER.name()) и меняю его на PermitAll()
Кроме того, на веб-странице не выбрасывается исключение 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

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