權(quán)限控制,是一個系統(tǒng)當中必須的重要功能谒撼。張三只能訪問輸入張三的特定功能,李四不能訪問屬于趙六的特定菜單辟汰。這就要求對整個體系做一個完善的權(quán)限控制體系。該體系應(yīng)該具備針區(qū)分用戶阱佛、權(quán)限帖汞、角色等各種必須的功能。
本系列教程
【微服務(wù)】輕松搞定SpringCloud微服務(wù)目錄
本系列為連載文章凑术,閱讀本文之前強烈建議您先閱讀前面幾篇翩蘸。
上一節(jié)我們講到API網(wǎng)關(guān)zuul ,對于Spring Cloud 來說,zuul除了可以做api接口的統(tǒng)一暴露淮逊,還應(yīng)該具備權(quán)限控制的相關(guān)功能催首。
單例應(yīng)用權(quán)限控制
在沒有引入Spring Cloud成套體系中,對于單體springboot 所開發(fā)的應(yīng)用使用springmvc自帶攔截器就可以實現(xiàn)對路徑的攔截泄鹏,截取request中特定的參數(shù)進行校驗郎任,如果合法就可以訪問,如果不合法便返回403备籽。
Spring Cloud Zuul 過濾器簡介
對于組件zuul中舶治,其實帶有權(quán)限認證的功能,那就是ZuulFilter過濾器。
ZuulFilter是Zuul中核心組件霉猛,通過繼承該抽象類尺锚,覆寫幾個關(guān)鍵方法達到自定義調(diào)度請求的作用。
開始起飛
起飛之前惜浅,還是那句話瘫辩,推薦先看前面博文。本次還是基于api網(wǎng)關(guān)功能的延伸坛悉,因此為了避免和前一片文章中子項目沖突杭朱,我們新建一個子項目,然后復(fù)制api-gateway-zuul項目的代碼吹散。
配置AccessTokenFilter文件
在新建的子項目下面,我們創(chuàng)建一個包config ,然后在下面創(chuàng)建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;//優(yōu)先級為0空民,數(shù)字越大,優(yōu)先級越低
}
@Override
public boolean shouldFilter() {
return true;//是否執(zhí)行該過濾器羞迷,此處為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);// 設(shè)值,可以在多個過濾器時使用
return null;
} else {
ctx.setSendZuulResponse(false);// 過濾該請求衔瓮,不對其進行路由
ctx.setResponseStatusCode(403);// 返回錯誤碼
ctx.setResponseBody("{\"result\":\"Request illegal!the token is null\"}");// 返回錯誤內(nèi)容
ctx.set("isSuccess", false);
return null;
}
}
}
說明:
filterOrder: filter執(zhí)行順序浊猾,通過數(shù)字指定
shouldFilter: filter是否需要執(zhí)行 true執(zhí)行 false 不執(zhí)行
run : filter具體邏輯
filterType : filter類型,分為pre、error热鞍、post葫慎、 route
> pre:請求執(zhí)行之前filter
route: 處理請求,進行路由
post: 請求處理完成后執(zhí)行的filter
error:出現(xiàn)錯誤時執(zhí)行的filter
官網(wǎng)給出一個四種類型的示意圖:
注入AccessToeknFilter
自行創(chuàng)建Filter需要手動加載到容器進行統(tǒng)一管理薇宠。在主方法Application.java中偷办,可以加入以下代碼:
/**
* 加載過濾器
* @return
*/
@Bean
public AccessTokenFilter accessFilter() {
return new AccessTokenFilter();
}
啟動并測試
分別啟動子項目 cloud-hyh-discovery-eureka 、cloud-hyh-service-1 以及剛剛創(chuàng)建的api網(wǎng)關(guān)的新子項目澄港。
首先可以訪問 http://localhost:8081/ 查看服務(wù)是否已經(jīng)都啟動完畢椒涯。
其次通過網(wǎng)關(guān)訪問service-1服務(wù)中的/ribbon/name 接口,查看是否允許訪問回梧。http://localhost:8080/cloud-service/ribbon/name废岂。通過訪問可以看到瀏覽器提示:
{"result":"Request illegal!the token is null"}
最后,訪問帶有權(quán)限認證的url狱意,http://localhost:8080/cloud-service/ribbon/name?token=www.hanyahong.com
可以看到瀏覽器可以通過驗證湖苞,進入了子系統(tǒng)中的API,并返回了相關(guān)結(jié)果详囤。
千萬之路剛開始-www.hanyahong.com-beijing該服務(wù)器端口8071
說明
一般token會通過一系列加密處理袒啼,另外一般是放在請求頭部。如果前后端分離的話就會設(shè)計跨域的問題。這個我們會在后面開一篇專門講解跨域訪問的文章細致講解蚓再。
另外滑肉,在實際應(yīng)用中還有很多需要配置的地方,絕非這般簡單的配置摘仅。這個希望在實際的項目當中靶庙,你們可以自己體會。
源碼
本文出處:http://www.hanyahong.com/
Github源碼:https://github.com/hanyahong/spring-cloud-microservice
轉(zhuǎn)發(fā)請注明出處娃属!