18 基於Spring Cloud Zuul的接口鑑權實現

以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()方法中完成。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章