1. 程式人生 > >REST API許可權控制

REST API許可權控制

前言

有人說,每個人都是平等的;也有人說,人生來就是不平等的;在人類社會中,並沒有絕對的公平,一件事,並不是所有人都能去做;一樣物,並不是所有人都能夠擁有。每個人都有自己的角色,每種角色都有對某種資源的一定權利,或許是擁有,或許只能是遠觀而不可褻玩。把這種人類社會中如此抽象的事實,提取出來,然後寫成程式,還原本質的工作,就是我們程式設計師該做的事了。有了一個這麼有範兒的開頭,下面便來談談基於RESTful,如何實現不同的人不同的角色對於不同的資源不同的操作的許可權控制。

RESTful簡述

本文是基於RESTful描述的,需要你對這個有初步的瞭解。RESTful是什麼?Representational State Transfer

,簡稱REST,是Roy Fielding博士在2000年他的博士論文中提出來的一種軟體架構風格。REST比較重要的點是資源狀態轉換,所謂"資源",就是網路上的一個實體,或者說是網路上的一個具體資訊。它可以是一段文字、一張圖片、一首歌曲、一種服務,總之就是一個具體的實在。而 “狀態轉換”,則是把對應的HTTP協議裡面,四個表示操作方式的動詞分別對應四種基本操作:

  1. GET,用來瀏覽(browse)資源
  2. POST,用來新建(create)資源
  3. PUT,用來更新(update)資源
  4. DELETE,用來刪除(delete)資源

RESTful CURD

資源的分類及操作

清楚了資源的概念,然後再來對資源進行一下分類,我把資源分為下面三類:

  1. 私人資源 (Personal Source)
  2. 角色資源 (Roles Source)
  3. 公共資源 (Public Source)

Sources

“私人資源”:是屬於某一個使用者所有的資源,只有使用者本人才能操作,其他使用者不能操作。例如使用者的個人資訊、訂單、收貨地址等等。“角色資源”:與私人資源不同,角色資源範疇更大,一個角色可以對應多個人,也就是一群人。如果給某角色分配了許可權,那麼只有身為該角色的使用者才能擁有這些許可權。例如系統資源只能夠管理員操作,一般使用者不能操作。“公共資源”:所有人無論角色都能夠訪問並操作的資源。

而對資源的操作,無非就是分為四種:

  1. 瀏覽 (browse)
  2. 新增 (create)
  3. 更新 (update)
  4. 刪除 (delete)

角色、使用者、許可權之間的關係

角色和使用者的概念,自不用多說,大家都懂,但是許可權的概念需要提一提。
“許可權”,就是資源與操作的一套組合,例如"增加使用者"是一種許可權,"刪除使用者"是一種許可權,所以對於一種資源所對應的許可權有且只有四種。

Permissions

角色使用者的關係:一個角色對應一群使用者,一個使用者也可以扮演多個角色,所以它們是多對多的關係。
角色許可權的關係:一個角色擁有一堆許可權,一個許可權卻只能屬於一個角色,所以它們是一(角色)對多(許可權)的關係
許可權使用者的關係:由於一個使用者可以扮演多個角色,一個角色擁有多個許可權,所以使用者與許可權是間接的多對多關係。

Relations

需要注意兩種特別情況:

  1. 私人資源與使用者的關係,一種私人資源對應的四種許可權只能屬於一個使用者,所以這種情況下,使用者和許可權是一(使用者)對多(許可權)的關係。
  2. 超級管理員的角色,這個角色是神一般的存在,能無視一切阻礙,對所有資源擁有絕對許可權,甭管你是私人資源還是角色資源。

資料庫表的設計

角色、使用者、許可權的模型應該怎麼樣設計,才能滿足它們之間的關係?

Models

對上圖的一些關鍵欄位進行說明:

Source
  • name: 資源的名稱,也就是其他模型的名稱,例如:user、role等等。
  • identity: 資源的唯一標識,可以像uuid,shortid這些字串,也可以是model的名稱。
  • permissions : 一種資源對應有四種許可權,分別對這種資源的browse、create、update、delete
Permission
  • source : 該許可權對應的資源,也就是Source的某一條記錄的唯一標識
  • action :對應資源的操作,只能是browse、create、update、delete四個之一
  • relation:用來標記該許可權是屬於私人的,還是角色的,用於OwnerPolicy檢測
  • roles: 擁有該許可權的角色
Role
  • users : 角色所對應的使用者群,一個角色可以對應多個使用者
  • permissions: 許可權列表,一個角色擁有多項權利
User
  • createBy : 該記錄的擁有者,在user標裡,一般等於該記錄的唯一標識,這一屬性用於OwnerPolicy的檢測,其他私有資源的模型設計,也需要加上這一欄位來標識資源的擁有者。
  • roles : 使用者所擁有的角色

策略/過濾器

在sails下稱為策略(Policy),在java SSH下稱為過濾器(Filter),無論名稱如何,他們工作原理是大同小異的,主要是在一條HTTP請求訪問一個Controller下的action之前進行檢測。所以在這一層,我們可以自定義一些策略/過濾器來實現許可權控制。
為行文方便,下面姑且允許我使用策略這一詞。

** 策略 (Policy) **

下面排版順序對應Policy的執行順序

  1. SessionAuthPolicy
    檢測使用者是否已經登入,使用者登入是進行下面檢測的前提。
  2. SourcePolicy
    檢測訪問的資源是否存在,主要檢測Source表的記錄
  3. PermissionPolicy
    檢測該使用者所屬的角色,是否有對所訪問資源進行對應操作的許可權。
  4. OwnerPolicy
    如果所訪問的資源屬於私人資源,則檢測當前使用者是否該資源的擁有者。

如果通過所有policy的檢測,則把請求轉發到目標action。

Policies

Sails下的許可權控制實現

在Sails下,有一個很方便的套件sails-permissions,集成了一套許可權管理的方案,本文也是基於該套件的原始碼所引出來的許可權管理解決方案。

結語

對程式設計師最大的挑戰,並不是能否掌握了哪些程式語言,哪些軟體框架,而是對業務和需求的理解,然後在此基礎上,把要點抽象出來,寫成計算機能理解的語言。

最後,希望這篇文章,能夠幫助你對許可權管理這一課題增加多一點點理解。

相關推薦

REST API許可權控制

前言 有人說,每個人都是平等的;也有人說,人生來就是不平等的;在人類社會中,並沒有絕對的公平,一件事,並不是所有人都能去做;一樣物,並不是所有人都能夠擁有。每個人都有自己的角色,每種角色都有對某種資源的一定權利,或許是擁有,或許只能是遠觀而不可褻玩。把這種人類社會中如此

利用BeEF REST API自動化控制僵屍主機

.... app https uri 應該 啟動 exception 但是 extension 本文已發布於Freebuf,屬於原創獎勵計劃,未經許可禁止轉載。 http://www.freebuf.com/articles/network/137662.html

認證鑑權與API許可權控制在微服務架構中的設計與實現

引言: 本文系《認證鑑權與API許可權控制在微服務架構中的設計與實現》系列的第一篇,本系列預計四篇文章講解微服務下的認證鑑權與API許可權控制的實現。 1. 背景 最近在做許可權相關服務的開發,在系統微服務化後,原有的單體應用是基於session的安全許可權方式,不能滿足現有的微服務架構的認

認證鑑權與API許可權控制在微服務架構中的設計與實現(四)

引言: 本文系《認證鑑權與API許可權控制在微服務架構中的設計與實現》系列的完結篇,前面三篇已經將認證鑑權與API許可權控制的流程和主要細節講解完。本文比較長,對這個系列進行收尾,主要內容包括對授權和鑑權流程之外的endpoint以及Spring Security過濾器部分踩坑的經歷。歡迎閱讀本系列

認證鑑權與API許可權控制在微服務架構中的設計與實現(三)

引言: 本文系《認證鑑權與API許可權控制在微服務架構中的設計與實現》系列的第三篇,本文重點講解token以及API級別的鑑權。本文對涉及到的大部分程式碼進行了分析,歡迎訂閱本系列文章。 1. 前文回顧 在開始講解這一篇文章之前,先對之前兩篇文章進行回憶下。在第一篇 認證鑑權與AP

Spring boot 那些事之RESRful API 許可權控制

Spring boot 那些事之RESRful API 許可權控制 泥瓦匠BYSocket 生活者 39 人讚了該文章 Spring Boot,支援約定優於配置,讓開發人員儘快啟動並執行專案。針對 Spring Boot 的學習和總結準備寫系列文章。 程式碼共享在【s

Spring Boot 之 RESRful API 許可權控制

一、為何用RESTful API 1.1 RESTful是什麼? RESTful(Representational StateTransfer)架構風格,是一個Web自身的架構風格,底層主要基於HTTP協議(ps:提出者就是HTTP協議的作者),是分散式應用架構的偉大實踐理論。R

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

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

認證鑑權與API許可權控制在微服務架構中的設計與實現(一)

引言: 本文系《認證鑑權與API許可權控制在微服務架構中的設計與實現》系列的第一篇,本系列預計四篇文章講解微服務下的認證鑑權與API許可權控制的實現。 1. 背景 最近在做許可權相關服務的開發,在系統微服務化後,原有的單體應用是基於Session的安全許可權方式,不能滿足現有的微服務架構的認證

基於RESTful API 設計使用者許可權控制

RESTful簡述   本文是基於RESTful描述的,需要你對這個有初步的瞭解。 RESTful是什麼? Representational State Transfer,簡稱REST,是Roy Fielding博士在2000年他的博士論文中提出來的一種軟體架構風格。 REST比較

ZooKeeper之Java客戶端API使用—許可權控制

         在ZooKeeper的實際使用中,我們的做法往往是搭建一個共用的ZooKeeper叢集,統一為若干個應用提供服務。在這種情況下,不同的應用往往是不會存在共享資料的使用場景的,因此需要解決不同應用之間的許可權問題。         為了避免儲存在ZooKee

Java API訪問ZK的許可權控制

無許可權訪問結點 /** * 對於ZK的授權訪問 * Created by liuhuichao on 2017/7/27. */ public class AutoSample {

gin-jwt對API進行許可權控制

前言 之前文章簡單介紹瞭如何執行gin+vue的前後端分離開源專案,該專案是學習了Gin實踐教程後結合vue-element-admin寫的,該教程講得很詳細,適合入門Gin。本篇文章將介紹gin+vue的前後端分離開源專案中如何使用gin-jwt對API進行許可權驗證。 安裝gin-jwt 在GOPATH目

[CVE-2017-5487] WordPress <=4.7.1 REST API 內容註入漏洞分析與復現

tps 文章 分析 請求 利用 api文檔 each includes 什麽 不是很新的漏洞,記錄下自己的工作任務 漏洞影響: 未授權獲取發布過文章的其他用戶的用戶名、id 觸發前提:wordpress配置REST API 影響版本:<= 4.7 0x01漏洞

ambari rest api (三)

api eno star alert warning nod warn 例如 sts 1.獲取指定主機指定組件的信息列表 http://ip:8080/api/v1/clusters/hdp_dev/hosts/hadoop003.edcs.org/host_compon

arcgis rest api - task

arc 處理 路徑 分析 圖層 ide bsp 指定 fin 網絡分析Task ColosetFacilityTask 最近設施點分析 ServiceAreaTask 服務範圍分析 RouteTask 路徑分析 查詢Task 圖層或者服務查詢要素信息 QueryT

<YaRN><Official doc><RM REST API's>

http star hide 單用戶 任務調度 suse item hid ould Overview ... YARN Architecture The fundamental idea of YARN is to split up the functionalit

sharepoint rest api 創建文檔庫 文件夾

tps quest console head nts itl child roo url function createFolder() { var requestHeaders = {

json-server模擬REST API

put foreign 6.0 功能 ron htm 寫入 ring har 一般情況下,一個APP的數據都需要等待接口人員開發完對應的接口才可以獲取到,這樣子的效率有點低。最好是我們可以自己模擬接口數據,進行頁面的數據填充,打通所有關節,之後等接口開發好了,改下接口地址就

【轉】ASP.NET Core API 版本控制

新的 你們 rabl api ref add read .net b- 幾天前,我和我的朋友們使用 ASP.NET Core 開發了一個API ,使用的是GET方式,將一些數據返回到客戶端 APP。我們在前端進行了分頁,意味著我們將所有數據發送給客戶端,然後進行一些data