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格式,否则属性将无法识别。

results matching ""

    No results matching ""