如何使用 ReactiveUserDetailsS​​ervice springboot 通过 Rest API 登录

Posted

技术标签:

【中文标题】如何使用 ReactiveUserDetailsS​​ervice springboot 通过 Rest API 登录【英文标题】:How to login via Rest API using ReactiveUserDetailsService springboot 【发布时间】:2019-03-16 03:47:33 【问题描述】:

我在 springboot 中使用响应式 spring 安全,我的前端是用 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】:

也许尝试使用 formLogin.loginPage 方法来指向您的登录方法,而不是禁用 formLogin。我认为问题出在您的安全配置中。

编辑: 这些教程可能会有所帮助: https://dzone.com/articles/reactive-spring-security-for-webflux-rest-web-serv https://www.baeldung.com/spring-security-5-reactive

【讨论】:

我做到了,但没有运气 嗯。本教程看起来可能会有所帮助:dzone.com/articles/…

以上是关于如何使用 ReactiveUserDetailsS​​ervice springboot 通过 Rest API 登录的主要内容,如果未能解决你的问题,请参考以下文章

[精选] Mysql分表与分库如何拆分,如何设计,如何使用

如果加入条件,我该如何解决。如果使用字符串连接,我如何使用

如何使用本机反应创建登录以及如何验证会话

如何在自动布局中使用约束标识符以及如何使用标识符更改约束? [迅速]

如何使用 AngularJS 的 ng-model 创建一个数组以及如何使用 jquery 提交?

如何使用laravel保存所有行数据每个行名或相等