Почему работает авторизация через сайт, но не в postman

Ссылка на код. Через Postman делаю запрос на регистрацию пользователя, он появляется в базе, все нормально, затем выбираю Авторизация дальше Basic auth, ввожу данные (имя и пароль пользователя), например, имя пользователя: [email protected] и пароль: petya Делаю запрос по адресу: http://localhost:8080/landlord/1 Необходимо сменить Роль с АРЕНДАТОР на АРЕНДОДАТЕЛЬ. Но я получаю ошибку в Postman, и в базе данных ничего не меняется. Я так понимаю, не работает авторизация, может я что-то неправильно написал в файле SecurityConfig?

Ошибка, которая высвечивается в Postman:

<html lang = "en">

<head>
<meta charset = "utf-8">
<title> Login Customer </title>
</head>

<body>
<div class = "container">
<form class = "form-signin" method = "post" action = "/ auth / login">
<h2 class = "form-signin-heading"> Login </h2>
<p>
<label for = "username"> Username </label>
<input type = "text" id = "username" name = "username" class = "form-control" placeholder = "Username" required>
        </p>
<p>
<label for = "password"> Password </label>
<input type = "password" id = "password" name = "password" class = "form-control" placeholder = "Password" required>
        </p>
<button class = "btn btn-lg btn-primary btn-block" type = "submit"> Sign in </button>
</form>
</div>
</body>

</html>

Вывод в IDEA:

Creation of SecureRandom instance for session ID generation using [SHA1PRNG]

SecurityConfig

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    private final UserDetailsService userDetailsService;

    @Autowired
    public SecurityConfig(@Qualifier("userDetailsServiceImpl") UserDetailsService userDetailsService) {
        this.userDetailsService = userDetailsService;
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .csrf().disable()
                .authorizeRequests()
                /** На какие страницы человек имеет доступы */
                .antMatchers("/").permitAll()
                .antMatchers("/user/registration").permitAll()
                .anyRequest()
                .authenticated()
                .and()
                .formLogin()
                .loginPage("/auth/login").permitAll()
                .defaultSuccessUrl("/auth/success")
                .and()
                .logout()
                .logoutRequestMatcher(new AntPathRequestMatcher("/auth/logout", "POST"))
                .invalidateHttpSession(true)
                .clearAuthentication(true)
                .deleteCookies("JSESSIONID")
                .logoutSuccessUrl("/auth/login");
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.authenticationProvider(daoAuthenticationProvider());
    }

    @Bean
    protected PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder(12);
    }

    @Bean
    protected DaoAuthenticationProvider daoAuthenticationProvider() {
        DaoAuthenticationProvider daoAuthenticationProvider = new DaoAuthenticationProvider();
        daoAuthenticationProvider.setPasswordEncoder(passwordEncoder());
        daoAuthenticationProvider.setUserDetailsService(userDetailsService);
        return daoAuthenticationProvider;
    }
}

Ответы (1 шт):

Автор решения: Blacit

Ответ: у меня нет такой возможности, точнее не реализовано, не знаю, возможно такое создать или нет. Но подозреваю, что реально.

Изначально выбирайте, хотите создавать с фронтом или без, если без, то вам нужны только Rest-контроллеры(я так и начал делать) и авторизацию можете взять с этой и этой ссылки. Дальше в Postman проделывайте Post запрос с телом - это будет ваша авторизация. !ВНИМАНИЕ! Обязательно прочитайте статьи по ссылкам, которую выше прикрепил, в них подробно всё рассказывается, у меня здесь предоставлена не полная версия кода, лишь та, по которой могут быть вопросы. Также читайте комментарии, которые там пишут, особенно на англоязычном сайте, там ответ на вопрос про то, откуда взять "authenticationManager". Говорю сразу, его метод нужно обязательно прописать в классе SecurityConfig.

Надеюсь, что мой ответ хоть кому-то поможет и сохранит нервы.

Код того, как выглядит теперь принимающих метод для авторизации:

@PostMapping("/login")
    public String getLoginPage(@RequestBody UserDto userDto) {
        userService.loginUser(userDto);
        return "login";
    }

Можете заметить, что я принимаю UserDto, в нём у меня:

@NotNull
@NotEmpty
private String first_name;

@NotNull
@NotEmpty
private String last_name;

@NotNull
@NotEmpty
private String password;

@NotNull
@NotEmpty
private String email;

А вот сама проверку на авторизацию:

public void loginUser(UserDto accountDto) {
    UsernamePasswordAuthenticationToken authReq
            = new UsernamePasswordAuthenticationToken(accountDto.getEmail(), accountDto.getPassword());
    Authentication auth = authenticationManager.authenticate(authReq);
    SecurityContext sc = SecurityContextHolder.getContext();
    sc.setAuthentication(auth);
}
→ Ссылка