Spring Boot Security После авторизации остается на форме входа, ошибок не выдает

Почему то когда я ввожу свой логин и пароль и нажимаю кнопку, страница просто перезагружается, никаких ошибок не выдает, что я делаю не так? code

@Configuration
@EnableWebSecurity
public class WebSecurityConfig {
    @Bean
    public AuthenticationSuccessHandler successHandler() {
        SimpleUrlAuthenticationSuccessHandler handler = new SimpleUrlAuthenticationSuccessHandler();
        handler.setUseReferer(true);
        return handler;
    }
    @Bean
    public UserDetailsService userDetailsService() {
        return new UserDetailsServiceImpl();
    }
     
    @Bean
    public BCryptPasswordEncoder passwordEncoder() {
        BCryptPasswordEncoder bc=new BCryptPasswordEncoder();
        return bc;
    }
   
    @Bean
    public AuthenticationManager authenticationManager(AuthenticationConfiguration authConfig) throws Exception {
      return authConfig.getAuthenticationManager();
    }
    @Bean
    public DaoAuthenticationProvider authenticationProvider() {
        DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider();
        authProvider.setUserDetailsService(userDetailsService());
        authProvider.setPasswordEncoder(passwordEncoder());
        return authProvider;
    }
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.authenticationProvider(authenticationProvider());
    }
  
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
    http.sessionManagement()
    .sessionCreationPolicy(SessionCreationPolicy.STATELESS);;
    http.authorizeHttpRequests().requestMatchers("/acthasform/").permitAll()
    .anyRequest().authenticated()
   .and()
   .formLogin().loginPage("/login") .successHandler(successHandler())      
   .usernameParameter("u").passwordParameter("p")            
   .permitAll().defaultSuccessUrl("/regulatoryform/")
   .and()
.logout().permitAll().and().
    exceptionHandling().accessDeniedPage("/403")
    ;
    return http.build();
}
}

@Компонент открытый класс Securityhandler реализует AuthenticationSuccessHandler{

   @Override
   public void onAuthenticationSuccess(HttpServletRequest request,   HttpServletResponse response, Authentication authentication) throws IOException  {
        Set<String> roles = AuthorityUtils.authorityListToSet(authentication.getAuthorities());
        if (roles.contains("ROLE_ADMIN")) {
            response.sendRedirect("/regulatoryform/list.html");
        }
    }

}

public class UserDetailsServiceImpl implements UserDetailsService{
    
    @Autowired
    private UserRepository userRepository;
    
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        User user=userRepository.getUserByUsername(username);
        if (user==null) {
            throw new UsernameNotFoundException("Could not find user");
        }
        return new MyUserDetails(user); 
    }
}

открытый класс MyUserDetails реализует UserDetails{

частный Пользователь Пользователь;

 public MyUserDetails(User user) {
       this.user = user;
    }
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
    
Set<Role> roles = user.getRoles();
List<SimpleGrantedAuthority> authorities = new ArrayList<>();
         
   for(Role role : roles) {
   authorities.add(new SimpleGrantedAuthority(role.getName()));
     }
         
        return authorities;
    }

@Override
public String getPassword() {
    return user.getPassword();
}

@Override
public String getUsername() {
    return user.getUsername();
}

@Override
public boolean isAccountNonExpired() {
    return true;
}

@Override
public boolean isAccountNonLocked() {
    return true;
}

@Override
public boolean isCredentialsNonExpired() {
    return true;
}
@Override
public boolean isEnabled() {
    return user.isEnabled();
}

}

<!DOCTYPE html>
<html xmlns:th = "http://www.thymeleaf.org">
<head>
<meta charset = "ISO-8859-1">
<title>Login - Spring Security Example</title>
<style type = "text/css">
    body div {
        text-align: center;
    }
    label, input[type=text], input[type=password] {
        display: inline-block;
        width: 150px;
        margin: 5px;
    }
    input[type=submit] {
        width: 60px;
        margin: 10px;
        padding: 10px;
        text-align: center;
    }
</style>
</head>
<body>
<div>
    <div>
        <h2>Spring Security Login Form</h2>
    </div>
    <div th:if = "${param.error}">
        <h3>Invalid username and password.</h3>
    </div>
    <div th:if = "${param.logout}">
        <h3>You have been logged out.</h3>
    </div>
    <div>
    <form th:action = "@{/login}" method = "post">
        <div><label>Username: </label> <input type = "text" name = "u" /></div>
        <div><label>Password: </label><input type = "password" name = "p" /></div>
        <div><input type = "submit" value = "Login" /></div>
    </form>
    </div>
</div>   
</body>
</html>

Мои журналы DEBUG.

Вы не можете использовать форму входа без сеанса HTTP, поэтому удалите .sessionCreationPolicy(SessionCreationPolicy.STATELESS);;

dur 20.04.2023 10:31

@dur большое спасибо, это немного изменило ситуацию, теперь после ввода логина и пароля форма входа все так же появляется, но если я вручную наберу localhost:8080/regulatoryact/ то страница открывается, так что все равно не переходит автоматически на нужную страницу. Я разместил новые журналы DEBUG. Моя просьба и ответ остались без изменений. Если у вас есть немного свободного времени, пожалуйста, посмотрите.

Natasha 20.04.2023 15:46

В методе onAuthenticationSuccess нет оператора else, поэтому загружается та же страница.

dur 20.04.2023 17:52

@dur большое спасибо, проблема решена, у меня все заработало, вы мне очень помогли

Natasha 20.04.2023 20:56
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Версия Java на основе версии загрузки
Версия Java на основе версии загрузки
Если вы зайдете на официальный сайт Spring Boot , там представлен start.spring.io , который упрощает создание проектов Spring Boot, как показано ниже.
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
0
4
61
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
  1. В моем случае ошибка заключалась в определении sessionCreationPolicy(SessionCreationPolicy.STATELESS); Я удалил эту сторону.
  2. В своей программе я сделал свой компонент для перенаправления после успешной аутентификации, но забыл использовать его в WebSecurityConfig. Правильный код
@Configuration
@EnableWebSecurity
public class WebSecurityConfig {
     @Autowired
        Securityhandler successHandler;

    @Bean
    public UserDetailsService userDetailsService() {
        return new UserDetailsServiceImpl();
    }

    @Bean
    public BCryptPasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    @Bean
    public AuthenticationManager authenticationManager(AuthenticationConfiguration authConfig) throws Exception {
        return authConfig.getAuthenticationManager();
    }

    @Bean
    public DaoAuthenticationProvider authenticationProvider() {
        DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider();
        authProvider.setUserDetailsService(userDetailsService());
        authProvider.setPasswordEncoder(passwordEncoder());
        return authProvider;
    }

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
 
http.authorizeHttpRequests().requestMatchers("/acthasform/").permitAll().anyRequest().authenticated();
http.authenticationProvider(authenticationProvider());
http.formLogin().loginPage("/login").permitAll().successHandler(successHandler).usernameParameter("username").passwordParameter("password").permitAll().and()
.logout().permitAll().and().exceptionHandling().accessDeniedPage("/403");

return http.build();
    }
}

@Компонент открытый класс Securityhandler реализует AuthenticationSuccessHandler{

@Override public void onAuthenticationSuccess (запрос HttpServletRequest, ответ HttpServletResponse, аутентификация аутентификации) выдает IOException { Установить роли = AuthorityUtils.authorityListToSet(authentication.getAuthorities()); если (роли.содержит("ROLE_ADMIN")) { response.sendRedirect("/regulatoryform/"); } еще { response.sendRedirect("/regulatoryact/"); } } }

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