SpringBoot WebFlux整合Spring Security进行权限认证

96 篇文章 3 订阅
60 篇文章 2 订阅

环境:Springboot2.5.8

请先阅读:

Reactor响应式编程(Flux、Mono)基本用法

Spring WebFlux入门实例并整合数据库实现基本的增删改查

Spring Boot Security防重登录及在线总数

简介

Spring Security的WebFlux支持依赖于WebFilter,对Spring WebFlux和Spring WebFlux.Fn的作用相同。WebMVC依赖于Filter。

依赖管理

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-webflux</artifactId>
</dependency>

安全配置

@Configuration
@EnableReactiveMethodSecurity
public class WebfluxSecurityConfig {
  @Bean
  public MapReactiveUserDetailsService userDetailsService() {
    // 配置一个基于内存的用户名
    UserDetails user = new Users() ;
    return new MapReactiveUserDetailsService(user);
  }
  // 密码编码器
  @Bean
  public PasswordEncoder passwordEncoder() {
    return new PasswordEncoder() {
      @Override
      public boolean matches(CharSequence rawPassword, String encodedPassword) {
        return rawPassword.equals(encodedPassword) ;
      }
      @Override
      public String encode(CharSequence rawPassword) {
        return rawPassword.toString() ;
      }
    };
  }
  @Bean
  public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
    http.csrf(csrf -> csrf.disable()) ;
    http.authorizeExchange(exchanges -> {
      exchanges.pathMatchers(HttpMethod.GET, "/css/**", "/resources/**").permitAll() ;
      exchanges.pathMatchers("/users/**").hasRole("ADMIN") ;
      exchanges.anyExchange().authenticated();
    }) ; 
    // 配置默认的登录
    http.formLogin();
    http.exceptionHandling(exceptionHandling -> {
      exceptionHandling.accessDeniedHandler((exchange, denied) -> {
        DataBuffer buffer = exchange.getResponse().bufferFactory().wrap("Access Denied".getBytes()) ;
        return exchange.getResponse().writeAndFlushWith(Mono.just(Mono.just(buffer))) ;
      }) ;
    }) ;
    return http.build();
  }
}

路由配置

基于Functional Endpoint配置路由信息

@Configuration
public class RouterConfig {
  @Bean
  public RouterFunction<ServerResponse> usersRouter() {
    return RouterFunctions.route().GET("/users/{id}", request -> {
      System.out.println("查询:" + request.pathVariable("id")) ;
      return ServerResponse.ok().bodyValue(new Users()) ;
    }).build() ;
  }
}

方法安全验证

@RestController
@RequestMapping("/antUsers")
public class UsersController {
  
  @GetMapping("/index")
  @PreAuthorize("hasRole('10000')")
  public Mono<String> index() {
    return Mono.just("success") ;
  }
  
}

完毕!!!

 图片

图片

图片

图片

图片

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值