遊戲陪玩系統原始碼的許可權設計,如何基於位運算實現?
前置知識
實際案例
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
- 如何在遊戲陪玩系統原始碼中聊天室內實現一個禮物系統?遊戲原始碼
- 遊戲陪玩系統原始碼中不同排序演算法的實現方式遊戲原始碼排序演算法
- 遊戲陪玩app原始碼開發,常用的倒數計時功能如何實現?遊戲APP原始碼
- 基於Spring Security和 JWT的許可權系統設計SpringJWT
- 關於遊戲陪玩系統原始碼後臺管理系統,需要思考的二三事遊戲原始碼
- 管理系統之許可權的設計和實現
- 遊戲陪玩系統開發,架構設計的開閉原則是如何實現的?遊戲架構
- 遊戲陪玩原始碼的移動端適配,應該如何實現?遊戲原始碼
- 遊戲陪玩系統原始碼中懶載入的實現方式有哪幾種?遊戲原始碼
- 遊戲陪玩app開發,高併發系統如何設計?遊戲APP
- learun通用許可權系統框架功能實現設計框架
- 如何實現遊戲陪玩系統中語音的錄製與播放?遊戲
- 基於RBAC的許可權管理系統
- 基於RBAC的許可權設計模型模型
- 如何開發陪玩系統原始碼的列表頁面,相關實現程式碼原始碼
- 什麼是遊戲陪玩app原始碼開發的過度設計,如何避免?遊戲APP原始碼
- 遊戲陪玩系統開發,音視訊混流的實現程式碼遊戲
- 如何在遊戲陪玩app原始碼中實現簡訊驗證碼登入?遊戲APP原始碼
- 透過websocket,實現遊戲陪玩系統的聊天室Web遊戲
- 許可權系統:許可權應用服務設計
- 基於RBAC實現許可權管理
- 陪玩系統原始碼實現音訊編碼的相關步驟原始碼音訊
- 如何進行遊戲陪玩系統原始碼中音視訊的自動化測試?遊戲原始碼
- 許可權系統:6個許可權概念模型設計模型
- 許可權系統:許可權應用服務設計Tu
- 實現直播app原始碼前端許可權設計,需要做什麼?APP原始碼前端
- 基於Spring框架應用的許可權控制系統的研究和實現Spring框架
- 如何利用 Spring Hibernate 高階特性設計實現一個許可權系統Spring
- 分散式系統中,許可權設計實踐分散式
- 帶你瞭解遊戲陪玩系統原始碼前端常用的儲存方式遊戲原始碼前端
- 遊戲陪玩原始碼的登入方式,簡訊驗證碼登入的實現遊戲原始碼
- 如何設計應用系統的資料許可權管理