GateWay做爲網關路由是擋在了咱們的系統最前邊,進行動態路由配置和轉發。那麼咱們就能夠在網關層進行網關鑑權。html
https://cloud.spring.io/spring-cloud-gateway/2.2.x/reference/html/java
以前說過GateWay的組件中有Filter(過濾器)這一功能,就是web開發的三大組件(Servlet、Filter、Listener)中的Filter,可是Gateway中使用的是WebFlux,而不是Servlet,有興趣的能夠了解下。在GateWay中有不少內置的過濾器,並且咱們還能夠自定義一個過濾器。react
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
請自行具有一點兒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
密碼:啓動應用時,在控制檯上有打印出來的。
@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(); } }
代碼地址:關注微信公衆號「小魚與Java」,回覆SpringCloud獲取