Gateway中使用SpringSecurity進行網關鑑權與權限控制

上一篇文章:Gateway使用入門

GateWay做爲網關路由是擋在了咱們的系統最前邊,進行動態路由配置和轉發。那麼咱們就能夠在網關層進行網關鑑權。html

https://cloud.spring.io/spring-cloud-gateway/2.2.x/reference/html/java

Gateway過濾器的介紹

以前說過GateWay的組件中有Filter(過濾器)這一功能,就是web開發的三大組件(Servlet、Filter、Listener)中的Filter,可是Gateway中使用的是WebFlux,而不是Servlet,有興趣的能夠了解下。在GateWay中有不少內置的過濾器,並且咱們還能夠自定義一個過濾器。react

Gateway內置過濾器

生命週期

  • PRE: 這種過濾器在請求被路由以前調用。
  • POST:這種過濾器在路由到微服務之後執行。

類型

  • GatewayFilter 和Predicate同樣,用在單個路由上web

  • GlobalFilter 用在整個網關以前spring

自定義過濾器

自定義一個類實現這兩個類就以了,直接上代碼:編程

咱們的需求就是,只有當你的請求參數中的username=admin纔給你放行。微信

/**
 * 微信公衆號 「小魚與Java」
 * <p>
 * 自定義一個GlobalFilter類
 *
 * @date 2020/4/14
 * @auther Lyn4ever
 */
@Component //必定要讓Spring管理這個bean
public class CustomFilter implements GlobalFilter, Ordered {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {

        /*
        這個request對象能夠獲取更多的內容
       好比,若是是使用token驗證的話,就能夠判斷它的Header中的Token值了
       爲了演示方便,我就判斷了它的參數
         */
        ServerHttpRequest request = exchange.getRequest();
        MultiValueMap<String, String> queryParams = request.getQueryParams();
        String username = queryParams.getFirst("username");
        if (!username.equals("admin")) {

            //不容許訪問,禁止訪問
            ServerHttpResponse response = exchange.getResponse();
            response.setStatusCode(HttpStatus.NOT_ACCEPTABLE); //這個狀態碼是406

            return exchange.getResponse().setComplete();
        }
        //放行
        return chain.filter(exchange);
    }

    /**
     * 這是Ordered接口的中的方法
     * 過濾器有一個優先級的問題,這個值越小,優先級越高
     * @return
     */
    @Override
    public int getOrder() {
        return 0;
    }
}

具體的演示就不作了,自行下載代碼就能夠ide

GateWay集成SpringSecurity

請自行具有一點兒SpringSecurity使用能力,若是不會的話,關注「小魚與Java」後臺回覆SpringSecurity獲取教程spring-boot

Gateway用的是webflux,不一樣於Servlet,因此使用上會和在SpringMVC中使用有很大差異。官網地址微服務

  • 引入依賴
<!--springsecurity依賴-->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-security</artifactId>
</dependency>

引入這個依賴後,和咱們使用SpringMVC時是同樣的,輸入任何地址後,都會重定向到login

用戶名:user

密碼:啓動應用時,在控制檯上有打印出來的。

  • 配置類(主要是注入這幾個bean)
@Configuration
@EnableWebFluxSecurity
public class SecurityConfig {

    /**
     * 用戶的接口類
     * @return
     */
    @Bean
    public MapReactiveUserDetailsService userDetailsService() {
	      //自定義一個用戶
        UserDetails user = User.withDefaultPasswordEncoder()
                .username("admin")
                .password("admin")
                .roles("ADMIN")
                .build();
        return new MapReactiveUserDetailsService(user);
    }

    /**
     * 主要過濾配置類
     * @param http
     * @return
     */
    @Bean
    public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
        http
                .authorizeExchange()
                .pathMatchers("/order/**").permitAll()
                .pathMatchers("/user/**").hasRole("ADMIN")
                .anyExchange().authenticated()
                .and()
                .httpBasic().and()
                .formLogin();
        return http.build();
    }
}
  • 在Gateway中使用SpringSecurity其實就是在Webflux中使用SpringSeccurity。由於Gateway本就是基於Spring5的響應式編程,在性能上要比SpringMVC(傳統的Servlet)開發好不少。

代碼地址:關注微信公衆號「小魚與Java」,回覆SpringCloud獲取

相關文章
相關標籤/搜索