Как войти через Rest API с помощью Springboot ReactiveUserDetailsService - PullRequest
0 голосов
/ 11 октября 2018

Я использую реактивную защиту Spring с Springboot, мой интерфейс построен на Angular 6, все работает нормально, если я использую форму входа Springboot по умолчанию.

Я хочу войти с rest api.

Метод повторного входа в систему:

@PostMapping(path = "/login", consumes = MediaType.APPLICATION_JSON_VALUE)
public Mono<UserDetails> login(@RequestBody User user) {
    Mono<UserDetails> isLoggedIn = Mono.empty();
    try{
        isLoggedIn = this.userDetailsService.findByUsername(user.getUsername());
    }catch (RuntimeException e){
        return isLoggedIn;
    }

    return isLoggedIn;
}

Мой SecurityConfig выглядит следующим образом:

@Configuration
@EnableWebFluxSecurity 
public class SecurityConfig {

    @Bean
    SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
    http.authorizeExchange().pathMatchers("/login","/signup","/api/users/login","/ui/**","/webjars/**").permitAll()
            .anyExchange().authenticated()
            .and()
            .httpBasic().disable()
            .formLogin().disable()
            .csrf().disable()
            .logout().disable();
    return http.build();
   }
}

Мой ReactiveUserDetailService следующим образом:

@Component
public class ServiceReactiveUserDetailsService implements ReactiveUserDetailsService {
     private UserRepo userRepo;

     public ServiceReactiveUserDetailsService(UserRepo userRepo) {
        this.userRepo = userRepo;
     }

     @Bean
     PasswordEncoder passwordEncoder() {
        return PasswordEncoderFactories.createDelegatingPasswordEncoder();
     }

     @Override
     public Mono<UserDetails> findByUsername(String username) {
         return this.userRepo.findByUsername(username).map(CustomUser::new);
     }

    private class CustomUser extends User implements UserDetails {
        public CustomUser(User user) {
            super(user);
        }

       @Override
       public Collection<? extends GrantedAuthority> getAuthorities() {
          return AuthorityUtils.createAuthorityList("ROLE_USER");
       }

       @Override
       public boolean isAccountNonExpired() {
          return true;
       }

       @Override
       public boolean isAccountNonLocked() {
           return true;
       }

       @Override
       public boolean isCredentialsNonExpired() {
          return true;
       }

       @Override
       public boolean isEnabled() {
          return true;
       }
   }
}

Я новичок весноймир, любая помощь будет оценена

1 Ответ

0 голосов
/ 11 октября 2018

Возможно, попробуйте использовать метод formLogin.loginPage, чтобы указать на ваш метод входа в систему вместо отключения formLogin.Я думаю, что проблема в вашей конфигурации безопасности.

РЕДАКТИРОВАТЬ: эти учебные пособия могут помочь: https://dzone.com/articles/reactive-spring-security-for-webflux-rest-web-serv https://www.baeldung.com/spring-security-5-reactive

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...