需求:有個權限樹,資源掛在樹的節點上面。父節點的權限可以訪問所有子節點的資源。
更具體點,一個公司有一個部門,這個部門是棵樹(權限樹)。每發布一個課程,都需要設置屬於哪個部門的權限。每個人屬於部門。這樣,來一個人,他可以看到該部門所有子部門的所有資料。
方案1:基於數據庫的實現
這是一棵權限樹。子節點的值為父節點copy+一個遞增的數字。
資源的表有個字段存儲節點的數字。
當用戶權限在某個節點的時候,使用mysql like 'X%' 就可以找到下面的所有的資源。
方案2:
使用搜索引擎實現。
資源a掛在1上,a的標簽是[1];資源b掛在2上,標簽是[1,2]
用戶權限是1,可以找到a,b的資源。如果用戶權限是2,用2搜索,可以找到b的資源
標簽:就是從根到當前節點的路徑。中間用,或者空格分割,這樣es就可以分詞。
方案1跟2各有千秋。方案1 在多表join的時候,比較方便。實際業務場景除了權限做過濾,還有其他的搜索條件。