15.知识库权限控制
15.知识库权限控制
概述
知识库的权限控制指的是针对URule Pro里的规则项目、项目里的各种类型文件的读写权限控制。
当我们的知识库里多个规则项目,每个项目由不同的人负责,同时又有多人负责定义规则项目里不同的规则文件,这时就有必要通过URule Pro提供的知识库权限控制机制,让不同的操作人员只能读写自己负责的规则项目或规则文件,这样可以防止误操作的发生。
权限配置方式操作起来也比较简单,就是在配置配置权限的项目、文件或目录上右键,在弹出的菜单中选择“配置权限”项,即可打开当前项目、文件或目录的权限配置,如下图所示:
如上图所示,配置权限时,首先需要选择配置权限的主体,比如默认是用户,然后右边会出现这个主体对当前项目、文件或目录的读写配置情况,默认情况下,如果不勾选“启用”复选框,那么当前主体对当前项目、文件或目录是拥有读写权限的,一旦勾选就必须要配置相应的读写权限。
在运行时,对于权限的计算采用的是继承计算方式,也就是在对某个文件进行权限计算时,首先会检查当前登录的主体对当前文件有没有相应的权限配置,如果有就取这里的配置;如果没有就看这个文件所有的目录(如果在目录下的话)有没有相应的权限配置,依次类推,直到取到文件所在项目是否存在配置的权限。
举个例子,假如文件test.rs.xml位于项目test下,张三对项目test配置的权限是“查看”为“允许”;“编辑”为“不允许”,而对文件test.rs.xml没做任何权限配置,这样张三在登录后能看到test.rs.xml文件,但却无法对其进行各种编辑(修改保存、删除、重命名等)。
在URule Pro的权限配置当中,配置的目标对象我们称之为“主体”,他可能是一个用户,也可能是一个角色;实际使用时我们需要实现com.bstek.urule.console.Principal接口,当前系统有一个名为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 是否为管理员
*/
boolean isAdmin();
}
加载权限配置主体是通过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 请求上下文对象
* @return 返回当前登录主体对象(可能是用户或用户的角色)
*/
Principal getLoginPrincipal(RequestContext context);
/**
* @return 返回当前系统当中权限判断主体集合 ,供配置资源库权限使用
*/
List<Principal> getPrincipals();
}
EnvironmentProvider接口里的getPrincipals()方法就是返回可用于权限控制的主体对象集合,我们在上图中看到的user1、user2两个用户对象就是引擎默认的EnvironmentProvider接口实现中提供的两个用于权限控制的主体对象。
在实现好这个接口后,将其配置到spring中成为一个标准的bean,引擎就会检测到并加载它。如果我们没有实现这个接口,那么将会采用系统默认的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;
}
}
可以看到,默认的实现类中getPrincipals方法返回“user1”和“user2”两个用户,所以我们可以在上图权限配置中看到这两个用户。
在实际使用当中,这里的主体可能是角色或其它,那么我们只需要在这里去返回对应的主体即可,同时为了方便权限配置页查看,可以通过在Spring的properties文件中定义属性“urule.authority.type”的值来改变具体的显示名称,这个属性默认值为“用户”,所以在上图中看到的是“用户名”和“用户显示名”。
需要注意的是属性“urule.authority.type”值为中文时需要先将中文编码为unicode格式,否则属性将无法识别。
权限维护
从2.1.0版本开始,在URule Pro中提供了一个页面用于查看、维护通过EnvironmentProvider接口的getPrincipals()返回的所有权限主体的已配置的权限信息。
打开URule Pro的框架页面,在左边项目列表上方的工具栏上,就可以找到这个用于查看、维护资源权限页面的入口,如下图所示:
点开之后可以看到如下图所示的页面效果:
在这个页面中,上方是查询栏,可以根据用户、资源信息进行查询,当然如果用户选择“全部”,资源框为空的话,那么查询出来的就是所有的资源权限信息,如下图所示:
在这个列表中,“资源状态”列表示当前资源是否存在,如果不存在,那么就会显示“已删除”的描述,这时我们就可以手动将这个资源权限信息删除了。“可读”、“可编辑”两列分别表示当前权限主体对当前资源的“可读”、“可编辑”权限,对于这里的权限,可以通过最后一列里的 修改按钮对资源权限进行调整。
这里的权限维护页面要求当前通过EnvironmentProvider接口返回的登录用户对象必须是管理员角色才可以看到并操作,如果是非管理员用户这个页面是不能查看并编辑的。
知识包的权限控制
知识包是URule Pro中外部调用规则的唯一入口,在知识包的管理页面当中如果当前登录用户是管理员,那么他可以进行所有操作,包括知识包创建、审核、发布、测试等等; 但登录人如果不是一个管理员,那么他在知识包管理页面里能做的操作就是有限制的,比如审核、发布等功能非管理就不可以操作,同时对于审核通过的知识包非管理员也是不可以进行任何维护的;但对于知识包的创建、测试,未审核通过的知识包的修改 非管理员是可以操作的。
更多建议: