1. 程式人生 > >【微服務】之七:輕鬆搞定SpringCloud微服務-API許可權控制

【微服務】之七:輕鬆搞定SpringCloud微服務-API許可權控制

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

本系列教程

本系列為連載文章,閱讀本文之前強烈建議您先閱讀前面幾篇。
上一節我們講到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
轉發請註明出處!

相關推薦

服務輕鬆SpringCloud服務-API許可權控制

許可權控制,是一個系統當中必須的重要功能。張三隻能訪問輸入張三的特定功能,李四不能訪問屬於趙六的特定選單。這就要求對整個體系做一個完善的許可權控制體系。該體系應該具備針區分使用者、許可權、角色等各種必須的功能。 本系列教程 本系列為連載文章,閱讀本文之前強烈建議您先閱讀前面幾篇。 上一節我們講到AP

服務輕鬆SpringCloud服務-負載均衡Ribbon

對於任何一個高可用高負載的系統來說,負載均衡是一個必不可少的名稱。在大型分散式計算體系中,某個服務在單例的情況下,很難應對各種突發情況。因此,負載均衡是為了讓系統在效能出現瓶頸或者其中一些出現狀態下可以進行分發業務量的解決方案。在SpringCloud 體系當中,加入了Netflix公司的很多優秀產品,其中

服務輕鬆SpringCloud服務-API閘道器zuul

通過前面幾篇文章的介紹,我們可以輕鬆搭建起來微服務體系中比較重要的幾個基礎構建服務。那麼,在本篇博文中,我們重點講解一下,如何將所有微服務的API同意對外暴露,這個就設計API閘道器的概念。 本系列教程 閘道器名稱解釋 閘道器(Gateway)又稱網間聯結器、協議轉換器。閘道器在網路層以上實現網路互連,

服務輕鬆SpringCloud服務-呼叫遠端元件Feign

上一篇文章講到了負載均衡在Spring Cloud體系中的體現,其實Spring Cloud是提供了多種客戶端呼叫的元件,各個微服務都是以HTTP介面的形式暴露自身服務的,因此在呼叫遠端服務時就必須使用HTTP客戶端。我們可以使用JDK原生的URLConnection、Apache的Http Client、

服務輕松SpringCloud服務-API權限控制

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

服務從零開始,輕鬆SpringCloud服務-配置中心

官方解釋 Spring Cloud provides tools for developers to quickly build some of the common patterns in distributed systems (e.g. configuration

服務從零開始,輕鬆SpringCloud服務系列--註冊中心(一)

微服務體系,有效解決專案龐大、互相依賴的問題。目前SpringCloud體系有強大的一整套針對微服務的解決方案。本文中,重點對微服務體系中的服務發現註冊中心進行詳細說明。本篇中的註冊中心,採用Netflix 公司的Eureka。 註冊中心簡介 Netflix Eureka:雲端負載均衡,一個基於 RES

框架之一從零開始,輕鬆SpringCloud服務系列--開山篇(spring boot 小demo)

Spring頂級框架有眾多,那麼接下的篇幅,我將重點講解SpringCloud微框架的實現 Spring 頂級專案,包含眾多,我們重點學習一下,SpringCloud專案以及SpringBoot專案 ————————————————————main———————————————————— 一

框架之一從零開始,輕鬆SpringCloud框架系列--開山篇

一、SpringCloud專案簡介   Spring Cloud:     微服務工具包,為開發者提供了在分散式系統的配置管理、服務發現、斷路器、智慧路由、微代理、控制匯流排等開發工具包。   Spring Boot:     旨在簡化建立產品級的 Spring

服務輕松SpringCloud服務-API網關zuul

公司 create lan ice 子項目 專題 系統 如果 rose 通過前面幾篇文章的介紹,我們可以輕松搭建起來微服務體系中比較重要的幾個基礎構建服務。那麽,在本篇博文中,我們重點講解一下,如何將所有微服務的API同意對外暴露,這個就設計API網關的概念。 本系列教

深入Java虛擬機Javac編譯與JIT編譯

p s ots 基本 關鍵字 目前 關註 script 和數 語言 轉載請註明出處:http://blog.csdn.net/ns_code/article/details/18009455 編譯過程 不論是物理機還是虛擬機,大部分的程序代碼從開始編譯到最終轉化

Java並發編程使用synchronized獲取互斥鎖的幾點說明

相互 strong enter 方法 虛擬 get tar 指令 自己 轉載請註明出處:http://blog.csdn.net/ns_code/article/details/17199201 在並發編程中,多線程同時並發訪問的資源叫做臨界資源,當多個線程同時

深入Java虛擬機器深入JVM位元組碼執行引擎

我們都知道,在當前的Java中(1.0)之後,編譯器講原始碼轉成位元組碼,那麼位元組碼如何被執行的呢?這就涉及到了JVM的位元組碼執行引擎,執行引擎負責具體的程式碼呼叫及執行過程。就目前而言,所有的執行引擎的基本一致: 輸入:位元組碼檔案 處理:位元組碼解析 輸出:執

深入Java虛擬機器Javac編譯與JIT編譯

編譯過程     不論是物理機還是虛擬機器,大部分的程式程式碼從開始編譯到最終轉化成物理機的目的碼或虛擬機器能執行的指令集之前,都會按照如下圖所示的各個步驟進行:     其中綠色的模組可

spring系列6bean的初始化和銷燬方法

bean的生命週期:bean建立---初始化----銷燬的過程 容器管理bean的生命週期:我們可以自定義初始化和銷燬方法;容器在bean進行到當前生命週期的時候來呼叫我們自定義的初始化和銷燬方法 構造(物件建立): 單例項:在容器啟動的時候建立物件 多例項:在每次獲

spring系列8屬性賦值

一:使用@Value賦值     基本數值     可以寫SpEL; #{}     可以寫${};取出配置檔案【properties】中的值(在執行環境變數裡面的值) demo:set,get省略 @Value("張三") private String na

spring系列14spring宣告式事務實現原理剖析

通過上一節事務環境搭建,我們知道,在搭建的5個步驟中,有兩個是spring為我們提供底層去稍作配置,然後使用的, 這兩個操作涉及的便是: @EnableTransactionManagement PlatformTransactionManager 其中,Platfor

spring系列7生命週期-BeanPostProcessor原理以及在spring底層中的運用

本章節重點說一下我們自定義的BeanPostProcessor的執行機制和呼叫棧。 事前準備: 1.自定義beanPostProcessor 2.註冊自定義的beanPostProcessor到容器中 1.自定義beanPostProcessor @Componen

[原創]unity3D學習功能實現圖片的旋轉/2d物體的旋轉

目標:滑鼠點選後,圖片朝向滑鼠點選的地方 涉及到:Mathf.Atan2(反正是計算角度的),rotation,Quaternion.Slerp 思路:下面的圖片是x軸對稱的,所以這個旋轉也是以圖片箭頭開始旋轉的。(為什麼?可能跟Atan2有關),根據滑鼠點選的位置與圖片的位置計算旋轉角度,在Quaterni

[原創]unity3D學習功能實現例項化

用處:一般當場景出現兩個及兩個以上,或者會出現重複的物體的時候,用例項化比較方便 目標:滑鼠點選後,在滑鼠點選的位置出現一個小球 涉及到:預製件,Instantiate(預製件,newVector(