Я работаю над проектом Spring MVC. Я использую Spring Security для защиты URL-адреса моего проекта. Пока я нажимаю кнопку входа, я успешно вхожу в систему, но получаю ошибку type=Forbidden, status=403 на localhost:8092/user/index URL. Я думаю, что Spring Security прерывает URL-адрес.
Вот код Spring Security:
CustomUserDetail
public class CustomUserDetail implements UserDetails {
private User user;
public CustomUserDetail(User user) {
super();
this.user = user;
}
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
SimpleGrantedAuthority authority = new SimpleGrantedAuthority(user.getRole());
return List.of(authority);
}
@Override
public String getPassword() {
return user.getPassword();
}
@Override
public String getUsername() {
return user.getEmail();
}
@Override
public boolean isAccountNonExpired() {
return true;
}
@Override
public boolean isAccountNonLocked() {
return true;
}
@Override
public boolean isCredentialsNonExpired() {
return true;
}
@Override
public boolean isEnabled() {
return true;
}
}
UserDetailsServiceImpl
public class UserDetailsServiceImpl implements UserDetailsService{
@Autowired
private UserRepo userRepo;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
User user = userRepo.getUserByUserName(username);
if (user == null)
{
throw new UsernameNotFoundException(username);
}
CustomUserDetail customUserDetail = new CustomUserDetail(user);
return customUserDetail;
}
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.csrf().disable()
.authorizeRequests()
.antMatchers("/admin/**").hasRole("ADMIN")
.antMatchers("/user/**").hasRole("USER")
.antMatchers("/**").permitAll()
.and()
.formLogin()
.loginPage("/login")
.loginProcessingUrl("/login")
.defaultSuccessUrl("/user/index");
}
Здесь внизу Controller
@Controller
@RequestMapping("/user")
public class UserController {
@Autowired
private UserRepo userRepo;
@RequestMapping(value = "/index")
public String login(Model mdl, Principal principal)
{
User user = userRepo.getUserByUserName(principal.getName());
mdl.addAttribute("user", user);
return "user/user-dashboard";
}
}
Вот мой user-dashboard.html while, который находится на src/main/resources/templates/user.
<!DOCTYPE html>
<html xmlns:th = "http://www.thymeleaf.org">
<head>
<meta charset = "ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<h1> Details of User</h1>
<p th:text = "${user.name}"></p>
<p th:text = "${user.email}"></p>
</body>
</html>
Я получил, когда нажимаю кнопку входа в систему, что URL-адрес времени http://localhost:8092/user/index
Whitelabel Error Page
This application has no explicit mapping for /error, so you are seeing this as a fallback.
Sat Mar 19 18:16:13 IST 2022
There was an unexpected error (type=Forbidden, status=403).
Forbidden
Снимок базы данных:




Я думаю, вам следует проверить две вещи.
PasswordEncoder, созданный методом PasswordEncoderFactories.createDelegatingPasswordEncoder().PasswordEncoderFactories.createDelegatingPasswordEncoder(). passwordEncoder.encode(password).при сохранении в БД сохраните его как role_user все заглавными буквами. Spring Security сравнивает роли как (роль + значение hasRole) == значение db.
Это решение не работает
Спасибо @junhyunny В моей роли в базе данных
Role_User, я изменил ее наROLE_USER, у меня сработало.