我是Spring Security的新手,我确信我的问题与我的无知有关,当我输入正确的凭据时,一切正常,但当输入错误凭据时,Spring Security仍显示在/process_login
页面上,并显示错误。我希望按照配置中的预期重新切换到/guest
,并在页面上显示错误,也许您能告诉我一些信息
https://github.com/NikitaMozolevsky/KameleonTrialTask2
配置
package com.example.kameleontrialtask2.config;
import com.example.kameleontrialtask2.security.AuthProviderImpl;
import com.example.kameleontrialtask2.services.PersonDetailsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
@EnableWebSecurity //указывает на то, что конфигурационный класс SpringSecurity
//it permits use @PreAuthorise, SS will check role before executing method
//usually uses in services
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
private final PersonDetailsService personDetailsService;
private final AuthProviderImpl authProvider;
private final String[] allowedPages = new String[] {
"/guest",
"/registration",
"/authorized",
"/error",
"/auth/registration",
"/css/**"
};
@Autowired
public SecurityConfig(PersonDetailsService personDetailsService, AuthProviderImpl authProvider) {
this.personDetailsService = personDetailsService;
this.authProvider = authProvider;
}
//настройка формы для логина
@Override //переопределяется из WebSecurityConfigurerAdapter
protected void configure(HttpSecurity http) throws Exception {
//конфигурация страницы входа, выхода, ошибки и т.д.
//конфигурация авторизации (доступ по роли к страницам)
//работает с http
http
//попытка отправки злоумышленииком формы, для каких-то злоумышленных
//дел, доджится токеном на каждой thymeleaf странице
.csrf().disable() //отключение защиты от межсайтовой подделки запросов
.authorizeHttpRequests()
//страницы доступные админу
//"ADMIN_ROLE" понимается как "ADMIN" автоматически SpSec
//возможна работа не с ролью, а с Authorities
//list of actions which user can do
/**можно удалить и настраивать доступ к методам аннотацией
* @PreAuthorise*/
.antMatchers("/admin").hasRole("ADMIN")
//страницы доступные всем
.antMatchers(allowedPages).permitAll()
//для получения остальных страниц и пользователем и админом
//can be deleted if will use @PreAuthorise and
//@EnableGlobalMethodSecurity(prePostEnabled = true)
//and mb something else
.anyRequest().hasAnyRole("USER", "ADMIN")
//остальные запросы недоступны
/*.anyRequest().authenticated()*/ //при отсутствии admin ограничений
.and() //and - объединитель разных настроек, настройка авторизации
.formLogin()
.loginPage("/guest") //метод захода в систему
//SpringSecurity ожидает что сюда придут логин и пароль
//SpringSecurity сам обрабатывает данные
.loginProcessingUrl("/process_login")
//unsuccessful with key error (located in view (th) show message)
.failureForwardUrl("/guest")
//что происходит при успешной аутентификации
//перенаправление на /hello, true - всегда
.defaultSuccessUrl("/authorized", true)
.and()
//удаление пользователя из сессии, удаление кукиз у пользователя
.logout().logoutUrl("/logout")
//redirect to this page after logout
.logoutSuccessUrl("/auth/login");
}
//настраивает логику аутентификации
//даем понять SpringSecurity что для аутентификации используется
//именно этот AuthProviderImpl
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
/*auth.authenticationProvider(authProvider);*/
auth.userDetailsService(personDetailsService)//упрощение, есть другая версия
//прогоняет пароль через BCryptPasswordEncoder
//при аутентификации
.passwordEncoder(getPasswordEncoder());
}
@Bean //возвращается используемый алгоритм шифрования
public PasswordEncoder getPasswordEncoder() {
return new BCryptPasswordEncoder();
}
}
我试着配置为手动进行身份验证,但我认为SpringSecurity有更聪明的方法来完成它
1条答案
按热度按时间66bbxpm51#
我很快就找到了答案,在Spring Configuration中,如果failureForwardUrl(“/guest”)方法中的凭据不正确,就不能转到同一个地址,需要将其改为另一个可以做同样事情的地址,例如failureforwardurl(“/guest_bad_credentials”)