Spring security 如何使用spring安全性保护reactor netServer?

Spring security 如何使用spring安全性保护reactor netServer?,spring-security,netty,spring-boot,reactor,Spring Security,Netty,Spring Boot,Reactor,我尝试使用SpringBootWebApplication和嵌入式tomcat开发一个“混合”服务器,并从reactor开发一个netServer来扩展我的RESTAPI。 没有Spring控制器,所有传入的请求都由netServer处理。 尽管如此,我还是希望有一个使用SpringSecurityMemberMe功能的登录页面来验证用户,并使用此验证来保护reactor netServer上的传入请求 根据本教程,我开始实现netServer 这是我的网络服务器: NetServer<F

我尝试使用SpringBootWebApplication和嵌入式tomcat开发一个“混合”服务器,并从reactor开发一个netServer来扩展我的RESTAPI。 没有Spring控制器,所有传入的请求都由netServer处理。 尽管如此,我还是希望有一个使用SpringSecurityMemberMe功能的登录页面来验证用户,并使用此验证来保护reactor netServer上的传入请求

根据本教程,我开始实现netServer

这是我的网络服务器:

NetServer<FullHttpRequest, FullHttpResponse> server = new TcpServerSpec<FullHttpRequest, FullHttpResponse>(NettyTcpServer.class)
        .env(env)
        .dispatcher("sync")
        .listen(8080)
        .options(opts)
        .consume(ch -> {
          // attach an error handler
          ch.when(Throwable.class, UserController.errorHandler(ch));

          // filter requests by URI
          Stream<FullHttpRequest> in = ch.in();

          // serve image thumbnail to browser
          in.filter((FullHttpRequest req) -> req.getUri().startsWith(UserController.GET_USER_PROFILE))
            .consume(UserController.getUserProfile(ch));

        })
        .get();
该服务由spring管理,因此我想我可以在其上使用spring GlobalMethodSecurity(我仍在开发这一部分,但我不确定这是保护我的netServer的最佳方式)

在reactor netServer上使用Spring安全性有更简单的方法吗??? 我的第一个网站版本是用nodeJS开发的,用于处理许多并发用户,我尝试使用jvmnio解决方案对其进行重构。 那么,spring/reactor/netty是一个拥有高度可伸缩性服务器的好解决方案,还是应该使用类似play的东西呢!还是vertx.io


非常感谢

您是否尝试过从JavaConfig
@Bean
方法中引导您的
NetServer
?比如:

@Configuration
@EnableReactor
class AppConfig {

  public Function<NetChannel, UserController> users() {
    return new UserControllerFactory();
  }

  @Bean
  public NetServer netServer(Environment env, Function<NetChannel, UserController> users) {
    return new TcpServerSpec(NettyTcpServer.class)
      .env(env)
      .dispatcher("sync")
      .listen(8080)
      .options(opts)
      .consume(ch -> {
        // attach an error handler
        ch.when(Throwable.class, UserController.errorHandler(ch));

        // filter requests by URI
        Stream<FullHttpRequest> in = ch.in();

        // serve image thumbnail to browser
        in.filter((FullHttpRequest req) -> req.getUri().startsWith(UserController.GET_USER_PROFILE))
          .consume(users.apply(ch));
      })
      .get();
  }

}
@配置
@使能反应堆
类AppConfig{
公共功能用户(){
返回新的UserControllerFactory();
}
@豆子
公共NetServer NetServer(环境环境、函数用户){
返回新的TcpServerSpec(nettytcserver.class)
.env(环境)
.dispatcher(“同步”)
.听(8080)
.选项(opts)
.消费(ch->{
//附加错误处理程序
ch.when(Throwable.class,UserController.errorHandler(ch));
//按URI筛选请求
流入=流入();
//将图像缩略图提供给浏览器
in.filter((FullHttpRequest req)->req.getUri().startsWith(UserController.GET\u USER\u PROFILE))
.消费(用户.应用(ch));
})
.get();
}
}
这将保留对Spring安全性的支持,并使您能够将处理程序作为bean共享,而不是作为静态方法的返回值共享。一般来说,在Reactor-TCP应用程序中需要做的所有事情都可以使用bean和注入,并将
NetServer
作为bean本身重新调用

@Component
public class StaticContextAccessor {

  private static StaticContextAccessor instance;

  @Autowired
  private ApplicationContext applicationContext;

  @PostConstruct
  public void registerInstance() {
      instance = this;
  }

  public static <T> T getBean(Class<T> clazz) {
      return instance.applicationContext.getBean(clazz);
  }

}
@Service
@PreAuthorize("true")
public class UserServiceImpl implements UserService{

  public String loadUserProfile(LoginDTO login){

    //TODO load profile in mongo

    return new GsonBuilder().create().toJson(login);
  }

}
@Configuration
@EnableReactor
class AppConfig {

  public Function<NetChannel, UserController> users() {
    return new UserControllerFactory();
  }

  @Bean
  public NetServer netServer(Environment env, Function<NetChannel, UserController> users) {
    return new TcpServerSpec(NettyTcpServer.class)
      .env(env)
      .dispatcher("sync")
      .listen(8080)
      .options(opts)
      .consume(ch -> {
        // attach an error handler
        ch.when(Throwable.class, UserController.errorHandler(ch));

        // filter requests by URI
        Stream<FullHttpRequest> in = ch.in();

        // serve image thumbnail to browser
        in.filter((FullHttpRequest req) -> req.getUri().startsWith(UserController.GET_USER_PROFILE))
          .consume(users.apply(ch));
      })
      .get();
  }

}