Почему появляется 403 Forbidden при нажатии на вход

Я работаю над проектом 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

Снимок базы данных:

Почему появляется 403 Forbidden при нажатии на вход

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
62
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я думаю, вам следует проверить две вещи.

  1. Какова роль данных пользователя в базе данных?
  • Я думаю, что в базе данных должен быть префикс «ROLE_», например ROLE_ADMIN.
  1. Проверьте пароль, который должен быть зашифрован и сохранен в базе данных.
  • DaoAuthenticationProvider от Spring Security использует по умолчанию PasswordEncoder, созданный методом PasswordEncoderFactories.createDelegatingPasswordEncoder().
  • Таким образом, вы должны сохранить зашифрованный пароль пользовательских данных, используя метод кодирования экземпляра PasswordEncoderFactories.createDelegatingPasswordEncoder(). passwordEncoder.encode(password).

Спасибо @junhyunny В моей роли в базе данных Role_User, я изменил ее на ROLE_USER, у меня сработало.

Faeem azaz Bhanej 19.03.2022 17:01

при сохранении в БД сохраните его как role_user все заглавными буквами. Spring Security сравнивает роли как (роль + значение hasRole) == значение db.

Это решение не работает

Faeem azaz Bhanej 19.03.2022 16:25

Другие вопросы по теме