15.知識庫權限控制(zhì)
概述
知識庫的權限控制(zhì)指的是針對URule Pro裏的規則項目、項目裏的各種類型文件的讀寫權限控制(zhì)。
當我們的知識庫裏多(duō)個(gè)規則項目,每個(gè)項目由不同的人(rén)負責,同時(shí)又有(yǒu)多(duō)人(rén)負責定義規則項目裏不同的規則文件,這時(shí)就有(yǒu)必要通(tōng)過URule Pro提供的知識庫權限控制(zhì)機制(zhì),讓不同的操作(zuò)人(rén)員隻能讀寫自己負責的規則項目或規則文件,這樣可(kě)以防止誤操作(zuò)的發生(shēng)。
權限配置方式操作(zuò)起來(lái)也比較簡單,就是在配置配置權限的項目、文件或目錄上(shàng)右鍵,在彈出的菜單中選擇“配置權限”項,即可(kě)打開(kāi)當前項目、文件或目錄的權限配置,如下圖所示:
如上(shàng)圖所示,配置權限時(shí),首先需要選擇配置權限的主體(tǐ),比如默認是用戶,然後右邊會(huì)出現這個(gè)主體(tǐ)對當前項目、文件或目錄的讀寫配置情況,默認情況下,如果不勾選“啓用”複選框,那(nà)麽當前主體(tǐ)對當前項目、文件或目錄是擁有(yǒu)讀寫權限的,一旦勾選就必須要配置相應的讀寫權限。
在運行(xíng)時(shí),對于權限的計(jì)算(suàn)采用的是繼承計(jì)算(suàn)方式,也就是在對某個(gè)文件進行(xíng)權限計(jì)算(suàn)時(shí),首先會(huì)檢查當前登錄的主體(tǐ)對當前文件有(yǒu)沒有(yǒu)相應的權限配置,如果有(yǒu)就取這裏的配置;如果沒有(yǒu)就看這個(gè)文件所有(yǒu)的目錄(如果在目錄下的話(huà))有(yǒu)沒有(yǒu)相應的權限配置,依次類推,直到取到文件所在項目是否存在配置的權限。
舉個(gè)例子,假如文件test.rs.xml位于項目test下,張三對項目test配置的權限是“查看”為(wèi)“允許”;“編輯”為(wèi)“不允許”,而對文件test.rs.xml沒做(zuò)任何權限配置,這樣張三在登錄後能看到test.rs.xml文件,但(dàn)卻無法對其進行(xíng)各種編輯(修改保存、删除、重命名等)。
在URule Pro的權限配置當中,配置的目标對象我們稱之為(wèi)“主體(tǐ)”,他可(kě)能是一個(gè)用戶,也可(kě)能是一個(gè)角色;實際使用時(shí)我們需要實現com.bstek.urule.console.Principal接口,當前系統有(yǒu)一個(gè)名為(wèi)DefaultPrincipal的默認實現。Principal接口源碼如下:
package com.bstek.urule.console;
/**
* @author Jacky.gao
* @since 2015年5月7日
*/
public interface Principal {
/**
* @return 名稱
*/
String getName();
/**
* @return 顯示名稱
*/
String getDisplayName();
/**
* @return 所在公司ID
*/
String getCompanyId();
/**
* @return 是否為(wèi)管理(lǐ)員
*/
boolean isAdmin();
}
加載權限配置主體(tǐ)是通(tōng)過com.bstek.urule.console.EnvironmentProvider接口實現,其源碼如下:
package com.bstek.urule.console;
import java.util.List;
import com.bstek.urule.console.servlet.RequestContext;
/**
* @author Jacky.gao
* @since 2015年3月27日
*/
public interface EnvironmentProvider {
/**
* @param context 請(qǐng)求上(shàng)下文對象
* @return 返回當前登錄主體(tǐ)對象(可(kě)能是用戶或用戶的角色)
*/
Principal getLoginPrincipal(RequestContext context);
/**
* @return 返回當前系統當中權限判斷主體(tǐ)集合 ,供配置資源庫權限使用
*/
List<Principal> getPrincipals();
}
EnvironmentProvider接口裏的getPrincipals()方法就是返回可(kě)用于權限控制(zhì)的主體(tǐ)對象集合,我們在上(shàng)圖中看到的user1、user2兩個(gè)用戶對象就是引擎默認的EnvironmentProvider接口實現中提供的兩個(gè)用于權限控制(zhì)的主體(tǐ)對象。
在實現好這個(gè)接口後,将其配置到spring中成為(wèi)一個(gè)标準的bean,引擎就會(huì)檢測到并加載它。如果我們沒有(yǒu)實現這個(gè)接口,那(nà)麽将會(huì)采用系統默認的EnvironmentProvider接口實現,其源碼如下:
package com.bstek.urule.console;
import java.util.ArrayList;
import java.util.List;
import com.bstek.urule.console.servlet.RequestContext;
/**
* @author Jacky.gao
* @since 2016年5月25日
*/
public class DefaultEnvironmentProvider implements EnvironmentProvider {
@Override
public Principal getLoginPrincipal(RequestContext context) {
DefaultPrincipal user=new DefaultPrincipal();
user.setCompanyId("bstek");
user.setName("admin");
user.setAdmin(true);
return user;
}
@Override
public List<Principal> getPrincipals() {
DefaultPrincipal user1=new DefaultPrincipal();
user1.setCompanyId("bstek");
user1.setName("user1");
user1.setDisplayName("張三");
DefaultPrincipal user2=new DefaultPrincipal();
user2.setCompanyId("bstek");
user2.setName("user2");
user2.setDisplayName("李四");
List<Principal> users=new ArrayList<Principal>();
users.add(user1);
users.add(user2);
return users;
}
}
可(kě)以看到,默認的實現類中getPrincipals方法返回“user1”和(hé)“user2”兩個(gè)用戶,所以我們可(kě)以在上(shàng)圖權限配置中看到這兩個(gè)用戶。
在實際使用當中,這裏的主體(tǐ)可(kě)能是角色或其它,那(nà)麽我們隻需要在這裏去返回對應的主體(tǐ)即可(kě),同時(shí)為(wèi)了方便權限配置頁查看,可(kě)以通(tōng)過在Spring的properties文件中定義屬性“urule.authority.type”的值來(lái)改變具體(tǐ)的顯示名稱,這個(gè)屬性默認值為(wèi)“用戶”,所以在上(shàng)圖中看到的是“用戶名”和(hé)“用戶顯示名”。
需要注意的是屬性“urule.authority.type”值為(wèi)中文時(shí)需要先将中文編碼為(wèi)unicode格式,否則屬性将無法識别。
權限維護
從2.1.0版本開(kāi)始,在URule Pro中提供了一個(gè)頁面用于查看、維護通(tōng)過EnvironmentProvider接口的getPrincipals()返回的所有(yǒu)權限主體(tǐ)的已配置的權限信息。
打開(kāi)URule Pro的框架頁面,在左邊項目列表上(shàng)方的工具欄上(shàng),就可(kě)以找到這個(gè)用于查看、維護資源權限頁面的入口,如下圖所示:
點開(kāi)之後可(kě)以看到如下圖所示的頁面效果:
在這個(gè)頁面中,上(shàng)方是查詢欄,可(kě)以根據用戶、資源信息進行(xíng)查詢,當然如果用戶選擇“全部”,資源框為(wèi)空(kōng)的話(huà),那(nà)麽查詢出來(lái)的就是所有(yǒu)的資源權限信息,如下圖所示:
在這個(gè)列表中,“資源狀态”列表示當前資源是否存在,如果不存在,那(nà)麽就會(huì)顯示“已删除”的描述,這時(shí)我們就可(kě)以手動将這個(gè)資源權限信息删除了。“可(kě)讀”、“可(kě)編輯”兩列分别表示當前權限主體(tǐ)對當前資源的“可(kě)讀”、“可(kě)編輯”權限,對于這裏的權限,可(kě)以通(tōng)過最後一列裏的 修改按鈕對資源權限進行(xíng)調整。
這裏的權限維護頁面要求當前通(tōng)過EnvironmentProvider接口返回的登錄用戶對象必須是管理(lǐ)員角色才可(kě)以看到并操作(zuò),如果是非管理(lǐ)員用戶這個(gè)頁面是不能查看并編輯的。
啓用默認安全機制(zhì)
在URule Pro當中提供了一個(gè)默認安全機制(zhì),這個(gè)安全機制(zhì)默認情況下是禁用的。如果我們不想實現EnvironmentProvider接口,不想為(wèi)URule Pro應用提供一個(gè)登錄的安全機制(zhì),那(nà)麽我們可(kě)以設置urule.security.enable屬性值為(wèi)true, 這樣就可(kě)以啓用默認的安全機制(zhì)。
一旦配置了urule.security.enable屬性值為(wèi)true後,要訪問所有(yǒu)的URule Pro相關頁面及設計(jì)器(qì),都會(huì)預先跳(tiào)轉到一個(gè)登錄頁面,如下圖所示:
在開(kāi)啓urule.security.enable屬性後,我們可(kě)以使用系統提供的一個(gè)默認管理(lǐ)員帳号登錄,該帳号用戶名密碼皆為(wèi)admin,采用默認的admin賬号登錄後,可(kě)以看到 框架左上(shàng)角的“權限配置”多(duō)了幾個(gè)菜單項,如下圖所示:
用admin帳号登錄後,可(kě)以通(tōng)過這裏的“更改密碼”功能來(lái)修改默認的admin帳号的密碼。 使用過程中,如果還(hái)需要添加其它非管理(lǐ)員帳号,那(nà)麽,可(kě)以通(tōng)過上(shàng)面的菜單中的“用戶管理(lǐ)”實現,點擊後會(huì)打開(kāi)默認的用戶管理(lǐ)頁面,我們可(kě)以在裏面添加新的非管理(lǐ)員用戶,如下圖所示:
可(kě)以看到,這裏的用戶管理(lǐ)頁面非常的簡單,也沒有(yǒu)提供用戶列表數(shù)據的分頁功能,所以我們添加的用戶數(shù)最好不要超過100個(gè),如果用戶人(rén)數(shù)較多(duō), 建議采用上(shàng)面介紹的通(tōng)過實現EnvironmentProvider接口來(lái)從外部接入用戶信息,自己實現安全機制(zhì),而不是采用默認的安全機制(zhì)。
添加完成用戶後,就可(kě)以在項目或規則文件上(shàng)通(tōng)過右鍵菜單來(lái)配置不同用戶對資源的使用權限。
當然對于新增的用戶,在登錄後同樣可(kě)以通(tōng)過主框架中左上(shàng)角“更改密碼”功能來(lái)修改默認的密碼。
知識包的權限控制(zhì)
知識包是URule Pro中外部調用規則的唯一入口,在知識包的管理(lǐ)頁面當中如果當前登錄用戶是管理(lǐ)員,那(nà)麽他可(kě)以進行(xíng)所有(yǒu)操作(zuò),包括知識包創建、審核、發布、測試等等; 但(dàn)登錄人(rén)如果不是一個(gè)管理(lǐ)員,那(nà)麽他在知識包管理(lǐ)頁面裏能做(zuò)的操作(zuò)就是有(yǒu)限制(zhì)的,比如審核、發布等功能非管理(lǐ)就不可(kě)以操作(zuò),同時(shí)對于審核通(tōng)過的知識包非管理(lǐ)員也是不可(kě)以進行(xíng)任何維護的;但(dàn)對于知識包的創建、測試,未審核通(tōng)過的知識包的修改 非管理(lǐ)員是可(kě)以操作(zuò)的。