知識庫的權(quán)限控制指的是針對URule Pro里的規(guī)則項目、項目里的各種類型文件的讀寫權(quán)限控制。
當(dāng)我們的知識庫里多個規(guī)則項目,每個項目由不同的人負(fù)責(zé),同時又有多人負(fù)責(zé)定義規(guī)則項目里不同的規(guī)則文件,這時就有必要通過URule Pro提供的知識庫權(quán)限控制機(jī)制,讓不同的操作人員只能讀寫自己負(fù)責(zé)的規(guī)則項目或規(guī)則文件,這樣可以防止誤操作的發(fā)生。
權(quán)限配置方式操作起來也比較簡單,就是在配置配置權(quán)限的項目、文件或目錄上右鍵,在彈出的菜單中選擇“配置權(quán)限”項,即可打開當(dāng)前項目、文件或目錄的權(quán)限配置,如下圖所示:
如上圖所示,配置權(quán)限時,首先需要選擇配置權(quán)限的主體,比如默認(rèn)是用戶,然后右邊會出現(xiàn)這個主體對當(dāng)前項目、文件或目錄的讀寫配置情況,默認(rèn)情況下,如果不勾選“啟用”復(fù)選框,那么當(dāng)前主體對當(dāng)前項目、文件或目錄是擁有讀寫權(quán)限的,一旦勾選就必須要配置相應(yīng)的讀寫權(quán)限。
在運(yùn)行時,對于權(quán)限的計算采用的是繼承計算方式,也就是在對某個文件進(jìn)行權(quán)限計算時,首先會檢查當(dāng)前登錄的主體對當(dāng)前文件有沒有相應(yīng)的權(quán)限配置,如果有就取這里的配置;如果沒有就看這個文件所有的目錄(如果在目錄下的話)有沒有相應(yīng)的權(quán)限配置,依次類推,直到取到文件所在項目是否存在配置的權(quán)限。
舉個例子,假如文件test.rs.xml位于項目test下,張三對項目test配置的權(quán)限是“查看”為“允許”;“編輯”為“不允許”,而對文件test.rs.xml沒做任何權(quán)限配置,這樣張三在登錄后能看到test.rs.xml文件,但卻無法對其進(jìn)行各種編輯(修改保存、刪除、重命名等)。
在URule Pro的權(quán)限配置當(dāng)中,配置的目標(biāo)對象我們稱之為“主體”,他可能是一個用戶,也可能是一個角色;實(shí)際使用時我們需要實(shí)現(xiàn)com.bstek.urule.console.Principal接口,當(dāng)前系統(tǒng)有一個名為DefaultPrincipal的默認(rèn)實(shí)現(xiàn)。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 是否為管理員
*/
boolean isAdmin();
}
加載權(quán)限配置主體是通過com.bstek.urule.console.EnvironmentProvider接口實(shí)現(xiàn),其源碼如下:
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 請求上下文對象
* @return 返回當(dāng)前登錄主體對象(可能是用戶或用戶的角色)
*/
Principal getLoginPrincipal(RequestContext context);
/**
* @return 返回當(dāng)前系統(tǒng)當(dāng)中權(quán)限判斷主體集合 ,供配置資源庫權(quán)限使用
*/
List<Principal> getPrincipals();
}
EnvironmentProvider接口里的getPrincipals()方法就是返回可用于權(quán)限控制的主體對象集合,我們在上圖中看到的user1、user2兩個用戶對象就是引擎默認(rèn)的EnvironmentProvider接口實(shí)現(xiàn)中提供的兩個用于權(quán)限控制的主體對象。
在實(shí)現(xiàn)好這個接口后,將其配置到spring中成為一個標(biāo)準(zhǔn)的bean,引擎就會檢測到并加載它。如果我們沒有實(shí)現(xiàn)這個接口,那么將會采用系統(tǒng)默認(rèn)的EnvironmentProvider接口實(shí)現(xiàn),其源碼如下:
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;
}
}
可以看到,默認(rèn)的實(shí)現(xiàn)類中g(shù)etPrincipals方法返回“user1”和“user2”兩個用戶,所以我們可以在上圖權(quán)限配置中看到這兩個用戶。
在實(shí)際使用當(dāng)中,這里的主體可能是角色或其它,那么我們只需要在這里去返回對應(yīng)的主體即可,同時為了方便權(quán)限配置頁查看,可以通過在Spring的properties文件中定義屬性“urule.authority.type”的值來改變具體的顯示名稱,這個屬性默認(rèn)值為“用戶”,所以在上圖中看到的是“用戶名”和“用戶顯示名”。
需要注意的是屬性“urule.authority.type”值為中文時需要先將中文編碼為unicode格式,否則屬性將無法識別。
從2.1.0版本開始,在URule Pro中提供了一個頁面用于查看、維護(hù)通過EnvironmentProvider接口的getPrincipals()返回的所有權(quán)限主體的已配置的權(quán)限信息。
打開URule Pro的框架頁面,在左邊項目列表上方的工具欄上,就可以找到這個用于查看、維護(hù)資源權(quán)限頁面的入口,如下圖所示:
點(diǎn)開之后可以看到如下圖所示的頁面效果:
在這個頁面中,上方是查詢欄,可以根據(jù)用戶、資源信息進(jìn)行查詢,當(dāng)然如果用戶選擇“全部”,資源框?yàn)榭盏脑?,那么查詢出來的就是所有的資源權(quán)限信息,如下圖所示:
在這個列表中,“資源狀態(tài)”列表示當(dāng)前資源是否存在,如果不存在,那么就會顯示“已刪除”的描述,這時我們就可以手動將這個資源權(quán)限信息刪除了?!翱勺x”、“可編輯”兩列分別表示當(dāng)前權(quán)限主體對當(dāng)前資源的“可讀”、“可編輯”權(quán)限,對于這里的權(quán)限,可以通過最后一列里的 修改按鈕對資源權(quán)限進(jìn)行調(diào)整。
這里的權(quán)限維護(hù)頁面要求當(dāng)前通過EnvironmentProvider接口返回的登錄用戶對象必須是管理員角色才可以看到并操作,如果是非管理員用戶這個頁面是不能查看并編輯的。
知識包是URule Pro中外部調(diào)用規(guī)則的唯一入口,在知識包的管理頁面當(dāng)中如果當(dāng)前登錄用戶是管理員,那么他可以進(jìn)行所有操作,包括知識包創(chuàng)建、審核、發(fā)布、測試等等; 但登錄人如果不是一個管理員,那么他在知識包管理頁面里能做的操作就是有限制的,比如審核、發(fā)布等功能非管理就不可以操作,同時對于審核通過的知識包非管理員也是不可以進(jìn)行任何維護(hù)的;但對于知識包的創(chuàng)建、測試,未審核通過的知識包的修改 非管理員是可以操作的。
更多建議: