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当中提供了一个默认安全机制,这个安全机制默认情况下是禁用的。如果我们不想实现EnvironmentProvider接口,不想为URule Pro应用提供一个登录的安全机制,那么我们可以设置urule.security.enable属性值为true, 这样就可以启用默认的安全机制。
一旦配置了urule.security.enable属性值为true后,要访问所有的URule Pro相关页面及设计器,都会预先跳转到一个登录页面,如下图所示:
在开启urule.security.enable属性后,我们可以使用系统提供的一个默认管理员帐号登录,该帐号用户名密码皆为admin,采用默认的admin账号登录后,可以看到 框架左上角的“权限配置”多了几个菜单项,如下图所示:
用admin帐号登录后,可以通过这里的“更改密码”功能来修改默认的admin帐号的密码。 使用过程中,如果还需要添加其它非管理员帐号,那么,可以通过上面的菜单中的“用户管理”实现,点击后会打开默认的用户管理页面,我们可以在里面添加新的非管理员用户,如下图所示:
可以看到,这里的用户管理页面非常的简单,也没有提供用户列表数据的分页功能,所以我们添加的用户数最好不要超过100个,如果用户人数较多, 建议采用上面介绍的通过实现EnvironmentProvider接口来从外部接入用户信息,自己实现安全机制,而不是采用默认的安全机制。
添加完成用户后,就可以在项目或规则文件上通过右键菜单来配置不同用户对资源的使用权限。
当然对于新增的用户,在登录后同样可以通过主框架中左上角“更改密码”功能来修改默认的密码。
知识包的权限控制
知识包是URule Pro中外部调用规则的唯一入口,在知识包的管理页面当中如果当前登录用户是管理员,那么他可以进行所有操作,包括知识包创建、审核、发布、测试等等; 但登录人如果不是一个管理员,那么他在知识包管理页面里能做的操作就是有限制的,比如审核、发布等功能非管理就不可以操作,同时对于审核通过的知识包非管理员也是不可以进行任何维护的;但对于知识包的创建、测试,未审核通过的知识包的修改 非管理员是可以操作的。