權限控制,是一個系統當中必須的重要功能。張三隻能訪問輸入張三的特定功能,李四不能訪問屬於趙六的特定菜單。這就要求對整個體系作一個完善的權限控制體系。該體系應該具有針區分用戶、權限、角色等各類必須的功能。html
【微服務】輕鬆搞定SpringCloud微服務目錄-獨立博客git
本系列爲連載文章,閱讀本文以前強烈建議您先閱讀前面幾篇。
上一節咱們講到API網關zuul ,對於Spring Cloud 來講,zuul除了能夠作api接口的統一暴露,還應該具有權限控制的相關功能。github
在沒有引入Spring Cloud成套體系中,對於單體springboot 所開發的應用使用springmvc自帶攔截器就能夠實現對路徑的攔截,截取request中特定的參數進行校驗,若是合法就能夠訪問,若是不合法便返回403。spring
對於組件zuul中,其實帶有權限認證的功能,那就是ZuulFilter過濾器。
ZuulFilter是Zuul中核心組件,經過繼承該抽象類,覆寫幾個關鍵方法達到自定義調度請求的做用。json
起飛以前,仍是那句話,推薦先看前面博文。本次仍是基於api網關功能的延伸,所以爲了不和前一片文章中子項目衝突,咱們新建一個子項目,而後複製api-gateway-zuul項目的代碼。後端
在新建的子項目下面,咱們建立一個包config ,而後在下面建立AccessTokenFilter文件,清單以下:api
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瀏覽器
官網給出一個四種類型的示意圖:
自行建立Filter須要手動加載到容器進行統一管理。在主方法Application.java中,能夠加入如下代碼:
/** * 加載過濾器 * @return */ @Bean public AccessTokenFilter accessFilter() { return new AccessTokenFilter(); }
分別啓動子項目 cloud-hyh-discovery-eureka 、cloud-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 轉發請註明出處!