Spring boot basic аутентификация с токеном для RESTAPI - PullRequest
0 голосов
/ 02 апреля 2019

Мне нужно предоставить логин пользователя с приложением SpringBoot.

Запросом на вход в систему пользователя будет запрос на отдых с полезной нагрузкой, состоящей из «имени пользователя» и «пароля».

Мне нужно сначала проверить эти учетные данные из БД и сгенерировать токен, действительный в течение определенного времени. Затем после входа в систему все последующие запросы будут иметь этот токен, и этот токен будет проверяться каждый раз.

Я выполнил проверку подлинности токена, но я действительно запутался при первом входе в систему, не знаю, как это сделать.

Даже при первом входе в систему система будет проверять аутентификацию токена, которая явно не удалась.

Я хочу, чтобы система просто генерировала токен в первый раз после проверки имени и пароля из базы данных.

Это первый раз, когда я вхожу в систему с помощью Spring Boot Security для входа в систему, поэтому я совершенно не в курсе этого. Хотя я много исследовал и читал в Интернете, но все еще не могу понять эту часть.

  • EDIT:

Ниже приведен класс конфигурации безопасности, который расширяет WebSecurityConfigurerAdapter

        @Bean
@Override
public AuthenticationManager authenticationManagerBean() throws Exception {
    return super.authenticationManagerBean();
}

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {

     auth.userDetailsService(userDetailsService)
    .passwordEncoder(getPasswordEncoder());
}



@Override
protected void configure(HttpSecurity http) throws Exception {
    http.cors().and().csrf().disable();
    http.authorizeRequests()
    .antMatchers("/","**/firstPage").authenticated()
            .anyRequest().permitAll()
            .and()
            .formLogin().loginPage("/login").
            permitAll()
            .and().logout().permitAll();
}

Ниже приведен запрос, который будет вызван после входа в систему. Как аутентифицировать пользователя в нем с помощью уже сгенерированного токена? Токен отправляется в заголовке запроса.

 @PostMapping(value = "/home")
public ResponseEntity<ConsolidateResponse> TestReques(@RequestBody TestParam testParam)
        throws Exception {

    //Some logic

   }

1 Ответ

0 голосов
/ 02 апреля 2019

Если вы отключаете вход в форму из класса конфигурации Spring и предоставляете одну конечную точку отдыха (/ auth), вы можете обрабатывать вход и генерировать токен. Здесь я использовал jwt для генерации токена.

 @RequestMapping(value = "/auth", method = RequestMethod.POST)
    public ResponseEntity<?> createAuthenticationToken(@RequestBody JwtAuthenticationRequest authenticationRequest) throws AuthenticationException, IOException {
        // Perform the security
        UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(
                authenticationRequest.getUsername(), authenticationRequest.getPassword());

        final Authentication authentication = authManager.authenticate(token);
        if (!authentication.isAuthenticated()) {
            throw new BadCredentialsException("Unknown username or password");
        }

        // Reload password post-security so we can generate token
        final UserDetails userDetails = userDetailsService.loadUserByUsername(authenticationRequest.getUsername());
        final String jwtoken = jwtTokenUtil.generateToken(userDetails);
        return ResponseEntity.ok(responseBean);
    }

Когда используется аутентификация без сохранения состояния, мы можем явно передать параметр токена в контроллер и проверить его. В случае, если включена аутентификация на основе сеанса, мы также можем использовать @AuthenticationPrincipal для получения текущего зарегистрированного пользователя.

//Stateless authentication
@PostMapping(value = "/home")
public ResponseEntity<ConsolidateResponse> test(@RequestBody TestParam testParam,String token)
        throws Exception {


    Boolean isValidToken = jwtTokenUtil.validateToken(token);
    if(isValidToken) {
     //Some logic 
    }else {
     //invalid request
    }
}





@PostMapping(value = "/home")
    public ResponseEntity<ConsolidateResponse> test(@RequestBody TestBean requestToken,
            @AuthenticationPrincipal User contextPrincipal, HttpServletRequest req) {

        Optional.ofNullable(contextPrincipal).orElseThrow(InvalidUserSession::new);


        //some logic
    }
...