Реализация входа в систему вручную с помощью Spring Security - PullRequest
0 голосов
/ 19 декабря 2018

Я разрабатываю приложение с помощью Spring Boot.Теперь я хочу реализовать контроль учетных записей, и я представляю Spring Session и Spring Security.Это фоновое приложение, основанное на REST-сервисах, интерфейсное приложение будет отдельным приложением, потребляющим эти сервисы.Я хочу контролировать, чтобы каждый пользователь, обращающийся к ресурсам, вошел в систему.

Я не хочу, чтобы Spring Security автоматически обрабатывал вход в систему, я хочу реализовать свою собственную службу входа в мой уже существующий CustomerController, которыйуправление другими службами.

Мой контроллер:

@RestController
@RequestMapping("/customer")
public class CustomerController {

    @Autowired
    private AuthenticationService authenticationService;

    @PostMapping("/login")
    public ResponseEntity loginSubmit(@RequestBody LoginForm form) {
        Errors errors = authenticationService.validateLoginForm(form);
        if (!errors.hasErrors()) {
            CustomerDTO result = authenticationService.findCustomerByEmailAndPassword(form);
            return new ResponseEntity(result, HttpStatus.OK);
        } else {
            return new ResponseEntity(errors.getAllErrors(), HttpStatus.OK);
        }
    }

    @GetMapping("/login")
    public ResponseEntity testBrowser() {
        return new ResponseEntity("Hello world", HttpStatus.OK);
    }

    [ . . . Other services . . . ]
}

Конфигурация Spring Security:

@EnableWebSecurity
@Configuration
public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .authorizeRequests()
                    .anyRequest().authenticated()
                    .and()
                .formLogin()
                    .loginPage("/customer/login")
                    .permitAll()
                    .and()
                .logout()
                    .permitAll()
                    .and()
                .httpBasic();
    }

    @Override
    public void configure(WebSecurity web) throws Exception {
        web.ignoring().antMatchers("/h2-console/**");
    }

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

}

По сути, это ограничивает доступ всех незарегистрированных пользователей к любому сервису, кроме входа в систему.В моем контроллере реализованы два метода входа в систему.Один GET для тестирования, другой POST.Когда я получаю доступ через браузер (GET), он работает, и я могу достичь точки останова.Однако, когда я пытаюсь POST (через Почтальон), он возвращает 401 Unauthorized, как и остальные службы, которые требуют входа в систему.Точка останова никогда не будет достигнута.

Я верю, что следую примеруЧто мне не хватает, пожалуйста?

1 Ответ

0 голосов
/ 19 декабря 2018

В весенних документах по безопасности упоминаются два параметра:

  1. login-page
  2. login-processing-url

Первый, где пользовательбудет перенаправлен с использованием GET в случае, если он не зарегистрирован, а второй - там, где форма страницы входа отправляется с использованием POST.

Вы получаете 401 Unauthorized, потому что значение по умолчанию для login-processing-url - / login ине / клиент / логин

документы: https://docs.spring.io/spring-security/site/docs/current/reference/htmlsingle/

...