以RBAC權限管理體系爲例,在Zuul的攔截器中基於訪問URI可以實現用戶的權限鑑別需求;鑑權攔截器示例如下所示:
@Component
public class AuthUserFilter extends ZuulFilter {
@Override
public String filterType() {
return PRE_TYPE; // 定義過濾器類型:前置過濾器
}
@Override
public int filterOrder() {
return PRE_DECORATION_FILTER_ORDER - 1; // 定義過濾器順序:比優先級最高的Filter還要優先執行
}
@Override
public boolean shouldFilter() {
// 根據URI判斷是否啓用該過濾器
RequestContext requestContext = RequestContext.getCurrentContext();
HttpServletRequest request = requestContext.getRequest();
// 這裏的鑑權邏輯,在實際項目中應該查詢數據庫或者緩存來實現,建議採用Redis緩存方式
if (request.getRequestURI().startsWith("/ms-goods/goods/comment")) {
return true; // 訪問專屬User會員的接口地址時,啓用過濾器
}
return false;
}
@Override
public Object run() throws ZuulException {
// 在shouldFilter()鑑權,在run()實現鑑權後的一些邏輯,比如緩存會員中心的訂單、收藏、評論等數據
RequestContext requestContext = RequestContext.getCurrentContext();
HttpServletRequest request = requestContext.getRequest();
Cookie[] cookies = request.getCookies();
String openid = null;
for (Cookie cookie:cookies) {
switch (cookie.getName()){
case "openid":
openid = cookie.getValue();
break;
default:
break;
}
}
return null;
}
}
AuthUserFilter是一個前置過濾器,執行順序定義在限流攔截器之後,鑑權業務在shouldFilter()方法中完成,鑑權的後置業務(如緩存會員個人數據等)在run()方法中完成。