遊戲陪玩系統原始碼的許可權設計,如何基於位運算實現?
前置知識
實際案例
const curPermission = 0b1001; // 當前使用者的許可權,「增」「查」 const allowCreate = (curPermission & C) === C; // => true const allowUpdate = (curPermission & U) === U; // => false
let curPermission = 0b0100; // 當前使用者只有「改」許可權 // C = 0b0001 D = 0b0010 // 新增「增」「刪」的許可權 curPermission = curPermission | C | U; // => 0b0111
let curPermission = 0b1110; // 當前使用者許可權,「刪」「改」「查」 // R = 0b1000 curPermission = curPermission & ~C; // => Ob0110 刪除了「查」的許可權
let curPermission = 0b1000; // 當前使用者許可權,「查」 // 無則增;C = 0b0001 curPermission ^ C; // => Ob1001 得到的為「增」「查」 // 有則減 curPermission ^ C; // => Ob1001 得到的為「查」,又將「增」許可權刪除了
const curPermission = 0b1000; // 當前使用者許可權 const D = 0b0010; // 刪 const U = 0b0100; // 改 const DandU = 0b0110; // 刪、改 都有 const allowDelete = (p: number) => (p & D) === D; const allowUpdate = (p: number) => (p & U) === U; const allowDeleteAndUpdate = (p: number) => (p & DandU) === DandU; const COLUMNS = [ { title: 'operation', dataIndex: 'operation', render: () => ( <> {allowUpdate(curPermission) && <button>Edit</button>} {allowDelete(curPermission) && <button>Delete</button>} </> ), }, ]; const retColumns = COLUMNS.filter((x) => { if (x.dataIndex === 'operation') { return allowDeleteAndUpdate(curPermission); } return true; }); // retColumns 是我們最終使用的 Table columns 資料
優點
缺點
const permissionList = [ { pid: 1, // position id 也就是 位置ID code: 0b0001, // 對應的編碼 } ];
const permissionList = ['pos1,0b0001', 'pos2,0b0011'];
TypeScript 加成
/** 定義 */ enum AuthCode { Read = 0b001, // 也可以寫成 1 Write = 0b010, // 也可以寫成 r << 1 或 2 /** 執行 execute */ Exec = 0b100, // 也可以寫成 r << 2 或 4 // 以下為複合型別 /** 0b011 */ ReadAndWrite = 0b011, /** Union of all host auth */ HostAuthMask = 0b111, } namespace Auth { /** * 驗證當前許可權是否存在 * @param validCode - 要驗證的許可權編碼(即使用者返回的編碼) * @param code - 定義好的許可權編碼 */ export const validator = (validCode: AuthCode, code: AuthCode): boolean => { return (validCode & code) === code; }; // curry 處理 validator() /** * 給使用者加入許可權 * @param userCode - 當前使用者擁有的許可權 * @param waitingCode - 待加入給使用者的許可權 * @returns 返回加入許可權後的所有許可權 */ export const add = ( userCode: AuthCode, waitingCode: AuthCode | AuthCode[] ): AuthCode => { let code: number; if (Array.isArray(waitingCode)) { code = waitingCode.reduce((acc, cur) => { return acc | cur; }, 0); } else { code = waitingCode; } return userCode | code; }; /** * 刪除使用者的許可權 * @param userCode - 當前使用者擁有的許可權 * @param rmCode - 要刪除的許可權 */ export const remove = ( userCode: AuthCode, rmCode: AuthCode | AuthCode[] ): AuthCode => { let code: number; if (Array.isArray(rmCode)) { code = rmCode.reduce((acc, cur) => { return acc | cur; }, 0); } else { code = rmCode; } return userCode & ~code; }; /** * 使用者許可權 Toggle * @description 無則增,有則減 * @param userCode - 當前使用者擁有的許可權 * @param tglCode - 要 toggle 的許可權 */ export const toggle = (userCode: AuthCode, tglCode: AuthCode) => { return userCode ^ tglCode; }; } // test validator // const userCode = 0b011; // 獲取到使用者在當前頁的許可權碼(讀、寫) // console.log(Auth.validator(userCode, AuthCode.Read)); // => true; 當前使用者擁有 讀 許可權 // console.log(Auth.validator(userCode, AuthCode.ReadAndWrite)); // => true; 當前使用者擁有 讀寫 許可權 // console.log(Auth.validator(userCode, AuthCode.Exec)); // => false; 當前使用者沒有 執行 許可權 // console.log(Auth.validator(userCode, AuthCode.Read | AuthCode.Exec)); // => false; 當前使用者沒有 讀,執行 許可權;兩個許可權都有才為真 // test add // let userCode = 0b000; // 獲取到使用者在當前頁的許可權碼(無許可權) // console.log((userCode = Auth.add(userCode, AuthCode.Read))); // => 1 === 0b001; 給當前使用者加入 讀 許可權 // console.log(Auth.validator(userCode, AuthCode.Read)); // => true; 驗證當前使用者已經擁有 讀 許可權 // console.log(Auth.validator(userCode, AuthCode.Write)); // => false; 驗證當前使用者沒有 寫 許可權 // console.log((userCode = Auth.add(userCode, [AuthCode.Write, AuthCode.Exec]))); // => 7 === 0b111; 給當前使用者加入 寫、執行 許可權 // console.log(Auth.validator(userCode, AuthCode.HostAuthMask)); // => true; 驗證當前使用者擁有所有許可權 // test remove // let userCode = 0b111; // 獲取到使用者在當前頁的許可權碼(所有許可權) // console.log(Auth.validator(userCode, AuthCode.HostAuthMask)); // => true; 驗證當前使用者有所用許可權 // console.log((userCode = Auth.remove(userCode, AuthCode.Read))); // => 6 === 0b110; 移除使用者 讀 許可權 // console.log(Auth.validator(userCode, AuthCode.Read)); // => false; 驗證當前使用者已經刪除 讀 許可權 // console.log( // (userCode = Auth.remove(userCode, [AuthCode.Write, AuthCode.Exec])) // ); // => 0 === 0b000; 移除使用者 讀、執行 許可權 // console.log(Auth.validator(userCode, AuthCode.Write)); // => false; 驗證當前使用者已經刪除 寫 許可權 // console.log(Auth.validator(userCode, AuthCode.Exec)); // => false; 驗證當前使用者已經刪除 執行 許可權 // test toggle // let userCode = 0b101; // 獲取到使用者在當前頁的許可權碼(執行、讀) // console.log((userCode = Auth.toggle(userCode, AuthCode.ReadAndWrite))); // => 6 === 0b110; 當前使用者刪除了 讀,新增了 寫(寫 無則增,讀 有則減) // console.log(Auth.validator(userCode, AuthCode.Read)); // => false; 驗證當前使用者無 讀 許可權 // console.log(Auth.validator(userCode, AuthCode.Write)); // => true; 驗證當前使用者有 寫 許可權
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69996194/viewspace-2840458/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 如何在遊戲陪玩系統原始碼中實現“刮刮樂”效果?遊戲原始碼
- 如何實現遊戲陪玩系統原始碼前端效能監控?遊戲原始碼前端
- 關於系統許可權的設計-位操作
- 關於許可權系統的設計
- 遊戲陪玩系統原始碼開發,如何實現圖片和動畫的優化?遊戲原始碼動畫優化
- 基於Spring Security實現許可權管理系統Spring
- 管理系統之許可權的設計和實現
- 續:關於許可權系統的設計
- 如何在遊戲陪玩系統原始碼中聊天室內實現一個禮物系統?遊戲原始碼
- 基於Spring Security和 JWT的許可權系統設計SpringJWT
- 遊戲陪玩系統原始碼中不同排序演算法的實現方式遊戲原始碼排序演算法
- 許可權系統設計
- 遊戲陪玩app原始碼開發,常用的倒數計時功能如何實現?遊戲APP原始碼
- 如何開發陪玩系統原始碼的列表頁面,相關實現程式碼原始碼
- learun通用許可權系統框架功能實現設計框架
- 關於遊戲陪玩系統原始碼後臺管理系統,需要思考的二三事遊戲原始碼
- 基於RBAC的許可權管理系統
- 遊戲陪玩系統開發,架構設計的開閉原則是如何實現的?遊戲架構
- 基於RBAC的許可權設計模型模型
- 遊戲陪玩原始碼的移動端適配,應該如何實現?遊戲原始碼
- 遊戲陪玩系統原始碼中懶載入的實現方式有哪幾種?遊戲原始碼
- 基於RBAC實現許可權管理
- 基於Vue2.0實現後臺系統許可權控制Vue
- 遊戲陪玩app開發,高併發系統如何設計?遊戲APP
- 許可權系統:許可權應用服務設計
- 陪玩系統原始碼實現音訊編碼的相關步驟原始碼音訊
- 許可權系統設計的理論基礎--RBAC
- 如何實現遊戲陪玩系統中語音的錄製與播放?遊戲
- 使用者角色許可權系統完整設計(基於shiro)
- 許可權系統:6個許可權概念模型設計模型
- 許可權系統:許可權應用服務設計Tu
- 設計實現業務系統中的使用者許可權管理
- 基於角色的許可權系統的問題
- 實現直播app原始碼前端許可權設計,需要做什麼?APP原始碼前端
- 許可權系統設計(2)--operation
- 許可權系統設計(3)-- subject
- 許可權系統設計(4)--resource
- 許可權系統設計--概論