Почему то когда я ввожу свой логин и пароль и нажимаю кнопку, страница просто перезагружается, никаких ошибок не выдает, что я делаю не так?
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.
@dur большое спасибо, это немного изменило ситуацию, теперь после ввода логина и пароля форма входа все так же появляется, но если я вручную наберу localhost:8080/regulatoryact/ то страница открывается, так что все равно не переходит автоматически на нужную страницу. Я разместил новые журналы DEBUG. Моя просьба и ответ остались без изменений. Если у вас есть немного свободного времени, пожалуйста, посмотрите.
В методе onAuthenticationSuccess
нет оператора else, поэтому загружается та же страница.
@dur большое спасибо, проблема решена, у меня все заработало, вы мне очень помогли
@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/"); } } }
Вы не можете использовать форму входа без сеанса HTTP, поэтому удалите
.sessionCreationPolicy(SessionCreationPolicy.STATELESS);;