Spring Security Thyemleaf страница 403 после входа в систему с использованием пользовательской страницы входа - PullRequest
2 голосов
/ 01 мая 2020

Я настраиваю веб-приложение, используя аутентификацию по имени пользователя и паролю с помощью thymeleaf и spring security. После успешного входа в систему я перенаправлен на URL, но я получаю 403 на этой странице. Ниже приведена моя конфигурация

@Override
protected void configure(HttpSecurity http) throws Exception {
http
    .authorizeRequests()
    .antMatchers("/", "index", "login", "/resource/**").permitAll()
    .antMatchers("/userpage").hasRole("USER")
    .anyRequest().authenticated()
    .and()
      .formLogin()
      .loginPage("/login")
      .defaultSuccessUrl("/userpage")
      .failureUrl("/login?error=true")
      .permitAll()
    .and()
      .logout()
      .logoutSuccessUrl("/login?logout=true")
      .invalidateHttpSession(true)
      .permitAll()
    .and()
      .csrf()
      .disable();
}

Служба «Мой пользователь»

public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
  User user = userRepository.getUserByEmail(username);
  if (user == null) {
    throw new UsernameNotFoundException("User not found.");
  }
  log.info("loadUserByUsername() : {}", username);
  return new org.springframework.security.core.userdetails.User(user.getId(), 
        user.getPassword(), getAuthority());
}

private List getAuthority() {
  return Arrays.asList(new SimpleGrantedAuthority("USER")); // TODO
}

Мои контроллеры

@RequestMapping(value = "/login", method = RequestMethod.GET)
public String login() {
  return "login";
}

@RequestMapping(value = "/userpage", method = RequestMethod.GET)
public String userpage(Model model) {
  model.addAttribute("user", new User());
  return "user-page";
}

Я вижу, как пользователь проходит проверку подлинности при отладке loadUserByUsername(), но страница возвращается There was an unexpected error (type=Forbidden, status=403). После того, как им направили defaultSuccessUrl("/userpage")

Любая помощь с благодарностью

Ответы [ 2 ]

2 голосов
/ 01 мая 2020

Возможная проблема в приведенном выше фрагменте кода заключается в том, что вы не предоставили loginProcessingUrl(). Это место, где Spring проверяет имя пользователя и пароли

        http.authorizeRequests()
        .antMatchers("/", "index", "login", "/resource/**").permitAll()
        .antMatchers("/userpage").hasRole("USER")
        .and()
        .formLogin()
        .loginPage( "/myLoginPage" ) // Pointing to the controller method
        .loginProcessingUrl( "/authenticateTheUser" ) // No coding is needed. Spring will automatically handle this. 
        .defaultSuccessUrl( "/myFirstPage", true )
        .permitAll()
        .and()
        .logout()
        .permitAll();
1 голос
/ 01 мая 2020

Метод loadUserByUsername (String username) отвечает за загрузку учетных данных (например, из базы данных), а не за проверку подлинности, наличие объекта «UserDetails» не означает, что пользователь с этими учетными данными проходит проверку подлинности и присоединяется к текущему сеансу ,

1) Проверьте правильность пароля пользователя: Spring Security (из 5) по умолчанию использует BCrypt для хэширования паролей, значит, сохраненный пароль (в базе данных) также должен быть ha sh, а не открытым текстом.

2) Возможен конфликт с аутентификацией Basi c, поэтому попробуйте отключить его, добавив:

  .and().httpBasic().disable()

в цепочку настроек безопасности.

...