Как сделать авторизацию по коду через Spring Security?

Для реализации авторизации по коду с использованием Spring Security в Java, необходимо выполнить следующие шаги:

1. Добавить зависимость Spring Security в файл pom.xml или build.gradle вашего проекта:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

2. Создать класс конфигурации для Spring Security, который будет содержать настройки безопасности и правил авторизации. Создайте новый класс с аннотацией @Configuration и наследующий класс WebSecurityConfigurerAdapter. Например:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable()
            .authorizeRequests()
                .antMatchers("/login").permitAll()
                .antMatchers("/admin/**").hasRole("ADMIN")
                .anyRequest().authenticated()
            .and()
                .formLogin()
                .loginPage("/login")
                .defaultSuccessUrl("/home")
                .permitAll()
            .and()
                .logout()
                .permitAll();
    }
    
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.authenticationProvider(authenticationProvider());
    }
    
    @Bean
    public DaoAuthenticationProvider authenticationProvider() {
        DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider();
        authProvider.setUserDetailsService(userDetailsService());
        authProvider.setPasswordEncoder(passwordEncoder());
        
        return authProvider;
    }
    
    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
    
    @Bean
    @Override
    public UserDetailsService userDetailsService() {
        // Здесь можно использовать свою реализацию UserDetailsService
        // для получения пользователей из базы данных или другого источника данных
        UserDetails user =
             User.withUsername("user")
                .password(passwordEncoder().encode("password"))
                .roles("USER")
                .build();
         
        return new InMemoryUserDetailsManager(user);
    }
}

В данном примере мы настраиваем правила авторизации, указывая разрешенные URL-ы, требующие определенные роли, а также указываем URL-ы для страницы входа и выхода из системы.

3. Создать контроллер для обработки запросов на аутентификацию. В этом контроллере, пользователь будет вводить код доступа, а Spring Security проверит его верность и осуществит вход в систему. Например:

@Controller
public class LoginController {
    
    @GetMapping("/login")
    public String login() {
        return "login";
    }
    
    @PostMapping("/login")
    public String submitLogin(@RequestParam("code") String code) {
        // Здесь производим проверку кода доступа и в случае успеха осуществляем вход пользователя
        if (validateCode(code)) {
            return "redirect:/home";
        } else {
            return "redirect:/login?error";
        }
    }
    
    private boolean validateCode(String code) {
        // Здесь производится проверка кода доступа, например, сравнение с заданным значением
        String validCode = "1234";
        return validCode.equals(code);
    }
    
    @GetMapping("/home")
    public String home() {
        return "home";
    }
}

В данном примере, после успешной проверки кода доступа, пользователь будет перенаправлен на домашнюю страницу.

4. Создать страницу с формой входа (login.html), где пользователь будет вводить код доступа. Например:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Login</title>
</head>
<body>
    <h2>Login</h2>
    <form action="/login" method="post">
        <input type="text" name="code" placeholder="Code" required>
        <button type="submit">Login</button>
    </form>
</body>
</html>

5. Создать домашнюю страницу (home.html), которая будет доступна только после успешной авторизации. Например:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Home</title>
</head>
<body>
    <h2>Welcome to the Home page!</h2>
</body>
</html>

Это основные шаги для реализации авторизации по коду с использованием Spring Security в Java. При необходимости, вы можете настроить дополнительные правила авторизации, добавить поддержку базы данных для хранения пользователей и ролей, а также использовать более сложные методы аутентификации, например, с использованием JWT.