“函式式”和“物件導向式”在許可權引擎中是如何融為一體的?
Function是繫結在ResourceType(class)上的,一種資源型別上有一個Function列表。record(object)從ResourceType(class)繼承這些Function列表。這種繫結在物件上的函式叫Method,而繫結在ResourceType上的函式叫Operation,它們的名字不同只是因為所處的層次不同,ResourceType + Operation + Field是面向軟體的終端使用者的,而Class + Method + Property是面向開發人員的,核心區別僅此而已,別的區別都是細節。
把控“資源”和“功能”的正交關係
現在有這樣一個問題:比如臥室裡有“空調”、有“電風扇”,這兩種資源都有“降溫”的能力(功能)。
我想直接控制“降溫”許可權,而不是分別控制“使用空調降溫”和“使用電風扇降溫”怎麼辦呢?這裡的“降溫”可以認為是Function,而“使用空調降溫”和“使用電風扇降溫”可以認為是Operation,因為它們繫結到了資源上。“降溫”能力集是比“使用空調降溫”和“使用電風扇降溫”能力集更大的能力集。
把函式固定在物件上,先定位物件然後再定位函式,將物件視為函式的耦合作用域(函式中傳入的this物件)這是物件導向的方法論。把函式和物件分開然後透過(Function, Input, Output)組合成三元組這是函式式方法論。
在OO世界中,由於Function已經被繫結到Object和ObjectType上去了,所以當房間裡有“空調”和“電風扇”這兩種降溫資源的時候我們若要控制某個主體不能降溫的話就只有分別控制他不能“使用空調降溫”和“使用電風扇降溫”了。
試試透過變換資源樹的結構能否解決上面那個問題呢?
+製冷裝置
----電風扇(ResourceType)
--------電風扇降溫(overwrite Operation)
--------風扇1(電風扇型別object1)
--------風扇2(電風扇型別object2)
----空調(ResourceType)
--------空調1(空調型別object1)
--------空調降溫(overwrite Operation)
----降溫(Operation)
現在,如果我們直接不讓某個主體不能使用“製冷裝置”下的“降溫”功能的話是可以做到使他既不能“使用空調降溫”也不能“使用電風扇降溫”的。
但是,空調除了是“製冷裝置”還是“制熱裝置”。重繪一下上圖的樹會是這樣。
+製冷裝置
----電風扇(ResourceType)
--------電風扇降溫(overwrite Operation)
--------風扇1(電風扇型別object1)
--------風扇2(電風扇型別object2)
----空調(ResourceType)
--------空調1(空調型別object1)
--------空調降溫(overwrite Operation)
----降溫(Operation)
+制熱裝置
----空調(ResourceType)
--------空調1(空調型別object1)
--------空調製熱(overwrite Operation)
----制熱(Operation)
融合“物件導向式”和“函式式”
問題出來了:“空調”節點在資源樹上出現在了兩個位置。這違反了樹形結構,違反了構造定理,所以我們錯了。
我們得從資源樹上“剪掉”製冷裝置和制熱裝置這兩個節點,得把它們放入新的維度中去。那個新的維度是什麼?是函式維度。上面我們遇到的問題是因為我們鑽到資源樹這一棵樹中去了,“製冷裝置”“制熱裝置”中的“裝置”是資源,而“製冷”和“制熱”是函式。
從資源的角度永遠沒辦法解決空調既出現在製冷裝置節點下又出現在制熱裝置節點下這個問題。資源和功能組合起來後就很好的解決了。(使用空調製冷"Operation",製冷"Function")(使用空調製熱"Operation",制熱"Function")(使用電風扇製冷"Operation",製冷"Function")(使用電熱扇制熱"Operation",制熱"Function")。
函式(能力、運動、時間)是適合組合到資源(空間)上的,只有與特定型別的資源十分緊密依賴的函式才是可以沿著資源樹繼承的。
在Anycmd這個開源許可權引擎中斷言過(Function, Function)這種型別的二元組是有意義的,現在終於幾乎確定找到了它的意義。(使用空調製冷"Operation",製冷"Function")這個二元組就是(Function, Function)型別的二元組(Operation集是Function集的子集,Operation是特殊的Function)。
(Function, Function)型別的Privilege二元組
(Function, Function)這種二元組目的是建立Function之間的層次關係。
在appSystem節點上(appSystem節點是根,雖然在空調和電風扇共同的任意父節點上都行但最佳應在appSystem這個根節點上,根節點是Global物件)新增一條命名為“製冷”的Operation記錄。然後建立(使用空調製冷"Operation",製冷"Function")(使用空調製熱"Operation",制熱"Function")(使用電風扇製冷"Operation",製冷"Function")這種(Function, Function)型別的二元組合。表示“電風扇製冷”和“空調製冷”繼承“製冷”,從而安全引擎鑑權當前請求“空調製冷”的主體是否有許可權的時候找到“空調製冷”這條Function記錄的父級記錄“製冷”,然後鑑權是沿著Function的層次進行一級一級向下進行的,如果當前主體沒有“製冷”許可權就直接沒有許可權了,如果有“製冷”許可權再接著驗證“空調製冷”許可權。
需要提及的是:
製冷”這條function記錄並不對應實際的程式設計師書寫的功能程式碼,而只是一條記錄,這條記錄的目的只是為製冷這種功能取個名字生成一個標識,然後用來和業務系統中的繫結在資源上的那些“操作”(繫結在資源上的Function稱Operation)建立(function, function)型別是組合從而表達功能間的層次關係。
許可權引擎在智慧傢俱領域的應用:
上面那種邏輯在智慧家居中可以應用。1 比如家長擔心使用電風扇製冷存在安全風險(擔心小孩子會將線頭布條輸入旋轉的電風扇中),所以家長主體可以將家居這個appSystem環境設定為當只有小孩子一個人在家的時候系統拒絕小孩主體開啟電風扇,但允許小孩子開啟空調;2 當家居中的主體數量大於3人時空調和電風扇可以被同時開啟,當少於3人時只能開啟其中之一。即使終端使用者有任意複雜的授權和鑑權需求Anycmd開源許可權引擎幾乎都能滿足。
相關文章
- 不同維度的拆分:物件導向和函式式的區別物件函式
- 《JavaScript物件導向精要》之二:函式JavaScript物件函式
- PHP 物件導向 (一)許可權修飾符PHP物件
- Day 14 匿名函式 內建函式 物件導向程式設計函式物件程式設計
- Python開發是程式導向、函式還是物件?Python教程Python函式物件
- 《JavaScript物件導向精要》之四:建構函式和原型物件JavaScript物件函式原型
- 『無為則無心』Python物件導向 — 54、重寫和super()函式Python物件函式
- 命令式、宣告式、物件導向、函式式、控制反轉之華山論劍(上)物件函式
- Python開發是程式導向、函式還是物件?Python基礎!Python函式物件
- JavaScript碎片———函式閉包(模擬物件導向)JavaScript函式物件
- JavaScript建構函式,物件導向程式設計JavaScript函式物件程式設計
- 如何使用函式指標呼叫類中的函式和普通函式函式指標
- 說說在 Python 中如何向函式傳參Python函式
- 前端筆記之JavaScript物件導向(一)Object&函式上下文&建構函式&原型鏈前端筆記JavaScript物件Object函式原型
- JS物件導向程式設計(二):建構函式JS物件程式設計函式
- JavaScript物件導向之二(建構函式繼承)JavaScript物件函式繼承
- js中在一個函式中引用另一個函式中的函式,可以這麼做JS函式
- js的函式和物件JS函式物件
- 類物件作為實參傳入函式,函式是複製物件還是直接使用物件的問題物件函式
- Rust中的into函式和from函式Rust函式
- React 是如何分辨函式式元件和類元件的?React函式元件
- vue在一個函式中呼叫另外一個函式Vue函式
- PostgreSQL訪問許可權查詢函式彙總和使用舉例SQL訪問許可權函式
- Solidity語言學習筆記————21、函式的訪問許可權和可見性Solid筆記函式訪問許可權
- C++中函式指標與函式物件C++函式指標物件
- 全網最適合入門的物件導向程式設計教程:49 Python函式方法與介面-函式與方法的區別和lamda匿名函式物件程式設計Python函式
- Js函式和物件學習體會JS函式物件
- JavaScript中的compose函式和pipe函式JavaScript函式
- Python:函式解釋(程式導向)Python函式
- 分散式系統中,許可權設計實踐分散式
- Java 建構函式與修飾符詳解:初始化物件與控制許可權Java函式物件
- 例項物件和函式物件的區別物件函式
- JS 中的函式表示式和函式宣告你混淆了嗎?JS函式
- 什麼是Python函式?如何定義函式?Python函式
- 對JavaScript中函式物件的理解JavaScript函式物件
- 函式物件、物件、原型函式物件原型
- Golang物件導向程式設計之建構函式【struct&new】Golang物件程式設計函式Struct
- Python集合是可變的嗎?rozenset()函式如何使用?Python函式
- 函式: 函式是怎麼使用的?函式