Доброго времени суток. Пишу пет-проект с использованием семейства фреймворков Spring. Наткнулся на следующую проблему при конфигурировании безопасности приложения через Spring Security: при отправке формы с шаблона, написанного на Thymeleaf, происходит редирект на страницу авторизации, указанную в конфиге, будто аутентификация и не производилась. Процесс аутентификации строится на основе учетных данных из бд.
Вот сам
конфиг:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Bean
public BCryptPasswordEncoder getPasswordEncoder() {
return new BCryptPasswordEncoder();
}
@Autowired
public AuthenticationProvider authProvider;
@Override
protected void configure(HttpSecurity security) throws Exception
{
security.csrf().disable()
.authorizeRequests()
.antMatchers("/").permitAll()
.antMatchers("/login").permitAll()
.antMatchers("/register").permitAll()
.antMatchers("/account").hasAnyAuthority("ADMIN", "STUDENT", "TEACHER")
.antMatchers("/scripts/**", "/css/**", "/img/**", "/fonts/**").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/auth")
.defaultSuccessUrl("/account")
.permitAll()
.and()
.logout()
.permitAll()
.logoutSuccessUrl("/");
}
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.authenticationProvider(authProvider);
}
}
Прикладываю также реализация интерфейса
AuthProvider
@Component
public class AuthProviderAdapter implements AuthenticationProvider {
@Autowired
private BCryptPasswordEncoder encoder;
@Autowired
private UserDetailsService service;
@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
String username = authentication.getName();
String password = authentication.getCredentials().toString();
System.out.println(username);
System.out.println(password);
UserDetails u = service.loadUserByUsername(username);
if (!encoder.matches(u.getPassword(), password)) {
throw new BadCredentialsException("Invalid credentials.");
}
return new UsernamePasswordAuthenticationToken(username, password, u.getAuthorities());
}
@Override
public boolean supports(Class<?> authentication) {
return authentication.equals(UsernamePasswordAuthenticationToken.class);
}
}
форму на thymeleaf
<form action="@{/login}" class="form_" id="auth__form" method="post">
<div class="auth__fields">
<input type="text" class="field" placeholder="Логин" name="login"><br>
<input type="password" class="field" placeholder="Пароль" name="password">
</div>
<div class="auth__error" th:if="${errorCode}">
<span th:text="${info}"></span>
</div>
<div class="auth__links">
<a href="#toregister" class="link">Зарегистрироваться</a><br>
<a href="#tochangepassword" class="link">Вы забыли пароль?</a><br>
</div>
</form>
и
контроллеры
@Controller
@RequestMapping(value = "/login")
public class LoginController {
@PostMapping
public void login() {
System.out.println("YES");
}
}
@Controller
@RequestMapping(value = "/auth")
public class AuthPageController {
@GetMapping
public String getView() {
return "auth";
}
@PostMapping
public void abc() {
System.out.println(1);
}
}
Мне нужно, чтобы данные, указанные в форме передавались в AuthProvider, а на основе объекта Authentication возвращаемого из метода authenticate, производилась авторизация. Ответ пытался найти в книге Spring Security in Action, но, к сожалению, там представлен пример только со стандартной login-page, поставляемой с Spring security, и in-memory-authentication.
Буду рад любым советам и ссылкам.