【微服務】之七:輕松搞定SpringCloud微服務-API權限控制


權限控制,是一個系統當中必須的重要功能。張三只能訪問輸入張三的特定功能,李四不能訪問屬於趙六的特定菜單。這就要求對整個體系做一個完善的權限控制體系。該體系應該具備針區分用戶、權限、角色等各種必須的功能。

本系列教程

【微服務】輕松搞定SpringCloud微服務目錄

【微服務】輕松搞定SpringCloud微服務目錄-獨立博客

本系列為連載文章,閱讀本文之前強烈建議您先閱讀前面幾篇。
上一節我們講到API網關zuul ,對於Spring Cloud 來說,zuul除了可以做api接口的統一暴露,還應該具備權限控制的相關功能。

單例應用權限控制

在沒有引入Spring Cloud成套體系中,對於單體springboot 所開發的應用使用springmvc自帶攔截器就可以實現對路徑的攔截,截取request中特定的參數進行校驗,如果合法就可以訪問,如果不合法便返回403。

Spring Cloud Zuul 過濾器簡介

對於組件zuul中,其實帶有權限認證的功能,那就是ZuulFilter過濾器。
ZuulFilter是Zuul中核心組件,通過繼承該抽象類,覆寫幾個關鍵方法達到自定義調度請求的作用。

開始起飛

起飛之前,還是那句話,推薦先看前面博文。本次還是基於api網關功能的延伸,因此為了避免和前一片文章中子項目沖突,我們新建一個子項目,然后復制api-gateway-zuul項目的代碼。

配置AccessTokenFilter文件

在新建的子項目下面,我們創建一個包config ,然后在下面創建AccessTokenFilter文件,清單如下:

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import javax.servlet.http.HttpServletRequest;

/**
 * Created by Administrator on 2017/12/21.
 */
public class AccessTokenFilter extends ZuulFilter {

    @Override
    public String filterType() {
        return "pre";//前置過濾器
    }

    @Override
    public int filterOrder() {
        return 0;//優先級為0,數字越大,優先級越低
    }

    @Override
    public boolean shouldFilter() {
        return true;//是否執行該過濾器,此處為true,說明需要過濾
    }

    @Override
    public Object run() {
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();
        String username = request.getParameter("token");
        if (null != username && username.equals("www.hanyahong.com")) {//暫時簡單化測試
            ctx.setSendZuulResponse(true);// 對該請求進行路由
            ctx.setResponseStatusCode(200);
            ctx.set("isSuccess", true);// 設值,可以在多個過濾器時使用
            return null;
        } else {
            ctx.setSendZuulResponse(false);// 過濾該請求,不對其進行路由
            ctx.setResponseStatusCode(403);// 返回錯誤碼
            ctx.setResponseBody("{\"result\":\"Request illegal!the token is null\"}");// 返回錯誤內容
            ctx.set("isSuccess", false);
            return null;
        }
    }
}

說明:

filterOrder: filter執行順序,通過數字指定
shouldFilter: filter是否需要執行 true執行 false 不執行
run : filter具體邏輯
filterType : filter類型,分為pre、error、post、 route
> pre:請求執行之前filter
route: 處理請求,進行路由
post: 請求處理完成后執行的filter
error:出現錯誤時執行的filter

官網給出一個四種類型的示意圖:
image.png

注入AccessToeknFilter

自行創建Filter需要手動加載到容器進行統一管理。在主方法Application.java中,可以加入以下代碼:

/**
     * 加載過濾器
     * @return
     */
    @Bean
    public AccessTokenFilter accessFilter() {
        return new AccessTokenFilter();
    }

啟動並測試

分別啟動子項目 cloud-hyh-discovery-eurekacloud-hyh-service-1 以及剛剛創建的api網關的新子項目。
首先可以訪問 http://localhost:8081/ 查看服務是否已經都啟動完畢。

其次通過網關訪問service-1服務中的/ribbon/name 接口,查看是否允許訪問。http://localhost:8080/cloud-service/ribbon/name。通過訪問可以看到瀏覽器提示:

{"result":"Request illegal!the token is null"}

最后,訪問帶有權限認證的url,http://localhost:8080/cloud-service/ribbon/name?token=www.hanyahong.com
可以看到瀏覽器可以通過驗證,進入了子系統中的API,並返回了相關結果。

千萬之路剛開始-www.hanyahong.com-beijing該服務器端口8071

說明

一般token會通過一系列加密處理,另外一般是放在請求頭部。如果前后端分離的話就會設計跨域的問題。這個我們會在后面開一篇專門講解跨域訪問的文章細致講解。
另外,在實際應用中還有很多需要配置的地方,絕非這般簡單的配置。這個希望在實際的項目當中,你們可以自己體會。

源碼

本文出處:http://www.hanyahong.com/
Github源碼:https://github.com/hanyahong/spring-cloud-microservice
轉發請注明出處!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM