上一篇文章:Gateway使用入門
GateWay作為網關路由是擋在了我們的系統最前邊,進行動態路由配置和轉發。那么我們就可以在網關層進行網關鑒權。
https://cloud.spring.io/spring-cloud-gateway/2.2.x/reference/html/
Gateway過濾器的介紹
之前說過GateWay的組件中有Filter(過濾器)這一功能,就是web開發的三大組件(Servlet、Filter、Listener)中的Filter,但是Gateway中使用的是WebFlux,而不是Servlet,有興趣的可以了解下。在GateWay中有很多內置的過濾器,而且我們還可以自定義一個過濾器。
Gateway內置過濾器
生命周期
- PRE: 這種過濾器在請求被路由之前調用。
- POST:這種過濾器在路由到微服務以后執行。
類型
-
GatewayFilter 和Predicate一樣,用在單個路由上
-
GlobalFilter 用在整個網關之前
自定義過濾器
自定義一個類實現這兩個類就以了,直接上代碼:
我們的需求就是,只有當你的請求參數中的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;
}
}
具體的演示就不做了,自行下載代碼就可以
GateWay集成SpringSecurity
請自行具備一點兒SpringSecurity使用能力,如果不會的話,關注“小魚與Java”后台回復SpringSecurity獲取教程
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獲取