codecamp

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中外部调用规则的唯一入口,在知识包的管理页面当中如果当前登录用户是管理员,那么他可以进行所有操作,包括知识包创建、审核、发布、测试等等; 但登录人如果不是一个管理员,那么他在知识包管理页面里能做的操作就是有限制的,比如审核、发布等功能非管理就不可以操作,同时对于审核通过的知识包非管理员也是不可以进行任何维护的;但对于知识包的创建、测试,未审核通过的知识包的修改 非管理员是可以操作的。

14.在数据库中存储知识库
16.客户端服务器配置
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }