授權規則可以對調用方的來源做控制,有白名單和黑名單兩種方式。
1.白名單:來源(origin)在白名單內的調用者允許訪問
2.黑名單:來源(origin)在黑名單內的調用者不允許訪問
例如,我們限定只允許從網關來的請求訪問order-service,那么流控應用中就填寫網關的名稱
Sentinel是通過RequestOriginParser這個接口的parseOrigin來獲取請求的來源的。
public interface RequestOriginParser { /** * 從請求request對象中獲取origin,獲取方式自定義 */ String parseOrigin(HttpServletRequest request); }
例如,在order-service服務中我們嘗試從request中獲取一個名為origin的請求頭,作為origin的值:
@Component public class HeaderOriginParser implements RequestOriginParser { @Override public String parseOrigin(HttpServletRequest request) { // 1.獲取請求頭
String origin = request.getHeader("origin"); // 2.非空判斷
if (StringUtils.isEmpty(origin)) { origin = "blank"; } return origin; } }
我們還需要在gateway服務中,利用網關的過濾器添加名為gateway的origin頭:
spring: application: name: gateway cloud: gateway: default-filters: - AddRequestHeader=Truth,Itcast is freaking awesome!
- AddRequestHeader=origin,gateway
給/order/{orderId} 配置授權規則:
效果實例
http://localhost:8088/order/103 ##服務直接訪問拒絕
{"msg": 沒有權限訪問, "status": 401} http://localhost:10010/order/103 ##網關訪問直接通過
{"id":103,"price":43900,"name":"駱駝(CAMEL)休閑運動鞋女","num":1,"userId":3,"user":{"id":null,"username":null,"address":null}}