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