@EgorSvinarev

Почему не происходит авторизация в Spring security?

Доброго времени суток. Пишу пет-проект с использованием семейства фреймворков 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.
Буду рад любым советам и ссылкам.
  • Вопрос задан
  • 72 просмотра
Решения вопроса 1
azerphoenix
@azerphoenix Куратор тега Java
Java Software Engineer
Добрый день.
Сделаю смелое предположение:

Вот, тут вы разрешили отправлять запросы на url/login
.antMatchers("/").permitAll()
    			.antMatchers("/login").permitAll()


А тут говорите, что страницей аутентификации является /auth
.loginPage("/auth")

В форме вы отправляете запрос на action="@{/auth}" А отправлять запрос на указанный урл вам просто не разрешено и вы получите 403 permission denied.
Добавьте в конфиг:
.antMatchers("/auth").permitAll()
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@EgorSvinarev Автор вопроса
Нашел ошибку. В атрибуте action забыл поставить префикс от thymeleaf, и запросы отправлялись не на тот url
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы