ElasticJob.3.0.0-UI 功能扩展 - 增加用户管理与配置权限

原创
01/29 17:33
阅读数 2.4K

说明

elasticJob是一个非常好用的分布式调度项目,在实现使用中,上手快容易集成到项目中快速开发与使用。但在实际的使用过程中,也发生部份情况与我们实际项目运作过程与管理过程有冲突。elasticJob官方UI管理控制平台提供了方便的注册中心连接、作业配置、数据源配置、调度历史日志查看等功能,但结合企业管理与从安全的角度看,目前比较明显的问题有以下:

  1. 官方只有root超级管理员账户和guest来宾账户,root有所有操作权限,guest只能看不能操作,我们使用人多,需要建立不同的登录账户;
  2. root开发给所有开发人员使用,有数据共享使用风险,如:误激活、修改他人项目job作业
  3. 注册中心节点连接信息公开未做角色区分,任意开发用root登录后,可连接到所有zk注册节点,可查看、修改zk节点下的job作业配置;
  4. 数据源配置创建后密码直接祼露,有涉漏风险
  5. job作业执行历史未做项目分类,默认直连上次已连接数据源的关系库,影响与项目无关数据判断和使用体验

鉴于上述问题,在考虑实际工作使用风险,做了修改后,新增以下能力:

  1. 扩展增加用户管理菜单功能,可自定义创建登陆UI控制台账户;
  2. 独立账户具备平台各功能的新增和修改、查看等功能,
  3. 独立账户下建立的zk注册中心、数据源、作业配置、JOB执行日志等数据按用户隔离,只有登录用户可查看与操作(root账户可查看所有)
  4. 独立账户下JOB作业配置只有创建用户可操作,杜绝非当前用户使用,避免共享误操作风险
  5. 增加登录用户会话超时配置,防止开发人员无操作长期打开界面。
  6. 数据源连接后按用户会话缓存,不使用后,会话失效,停止数据源的连接与使用;
  7. 独立账户作业配置可移交,如:人员离辞后,可直接将所有作业管理权限转移给交接人;

开源版本 

UI版本:shardingsphere-elasticjob-ui-3.0.0-RC1

下载地址:https://www.apache.org/dyn/closer.cgi/shardingsphere/elasticjob-ui-3.0.0-RC1/apache-shardingsphere-elasticjob-3.0.0-RC1-ui-src.zip

修改记录

新增用户管理功能

扩展用户管理功能,支持自定义增加用户,并可登录,数据按用户进行隔离查询;

来源文件:userManage.vue

views/user-manage目录

// 新增或修改文件
前端:
index.uve
api.vue
module/userManage.vue

router目录

//index.js
{
    path: '/user-manage',
    component: () => import('@/views/user-manage'),
    hidden: true,
    name: 'User Manage'
  }

lang目录

//en-US.js
userManage: {
    registDialog: {
      title: 'Login User',
      account: 'Account',
      userName: 'User name',
      password: 'Password',
      status: 'Status',
      operate: 'Operation',
      btnConfirmTxt: 'Confirm',
      btnCancelTxt: 'Cancel'
    },
    rules: {
      account: 'Please enter the Login account',
      userName: 'Please enter the User name',
      password: 'Please enter the Login password',
      status: 'Please select the status'
    },
    statusText: {
      OK: 'Enable',
      DISABLED: 'Disable'
    },
    selectText: [
      {
        label: 'Enable',
        value: 'OK'
      },
      {
        label: 'Disable',
        value: 'DISABLED'
      }
    ],
    actionText: {
      edit: 'Edit',
      disable: 'Disable',
      enable: 'Enable',
      remove: 'Remove'
    }
  }

//zh-CN.js
userManage: {
    registDialog: {
      title: '登陆用户',
      account: '账户',
      userName: '用户名',
      password: '密码',
      status: '状态',
      operate: '操作',
      btnConfirmTxt: '确定',
      btnCancelTxt: '取消'
    },
    rules: {
      account: '请输入登录账户',
      userName: '请输入用户名',
      password: '请输入密码',
      status: '请选择状态'
    },
    statusText: {
      OK: '已启用',
      DISABLED: '已禁用'
    },
    selectText: [
      {
        label: '启用',
        value: 'OK'
      },
      {
        label: '禁用',
        value: 'DISABLED'
      }
    ],
    actionText: {
      edit: '编辑',
      disable: '禁用',
      enable: '启用',
      remove: '删除'
    }
  }

业务逻辑实现

后台:
UserManageController.java
UserManageService.java
UserManageServiceImpl.java
UserManages.java
UserManage.java
SessionFilter.java

Configurations.xml配置文件存放目录与加载方式

文件名称设置

来源文件:ConfigurationsXmlRepositoryImpl

// 文件名定义
public ConfigurationsXmlRepositoryImpl() {
        super("Configurations.xml", GlobalConfiguration.class);
    }

存放目录加载

来源文件:HomeFolderUtils.java

// C:\Users\Administrator\.elasticjob-console\Configurations.xml
private static final String USER_HOME = System.getProperty("user.home");
private static final String CONSOLE_ROOT_FOLDER = ".elasticjob-console";

任务账户可创建注册中心配置

修改文件:registryCenter.vue

去掉disabled="isGuest"限制,任意登录用户均可创建

<el-button
        :disabled="isGuest"
        class="btn-plus"
        type="primary"
        icon="el-icon-plus"
        @click="add"
      >{{ $t("registryCenter.btnTxt") }}</el-button>

去掉disabled="isGuest"限制,任意登录用户均可连接(不可删除)

<el-button
    :type="scope.row.activated ? 'success' : 'primary'"
    :disabled="isGuest"
    icon="el-icon-link"
    size="small"
    @click="handleConnect(scope.row)"
  />

任务账户可创建事件追踪数据源配置

修改文件:dataSource.vue

去掉disabled="isGuest"限制,任意登录用户均可创建

<el-button
        :disabled="isGuest"
        class="btn-plus"
        type="primary"
        icon="el-icon-plus"
        @click="add"
      >{{ $t("registryCenter.btnTxt") }}</el-button>

去掉disabled="isGuest"限制,任意登录用户均可连接(不可删除)

<el-button
    :type="scope.row.activated ? 'success' : 'primary'"
    :disabled="isGuest"
    icon="el-icon-link"
    size="small"
    @click="handleConnect(scope.row)"
  />

获取注册中心当前账户下的job

获取指定用户下连接zk的配置

修改文件:JobOperationController.java

//新增
private RegistryCenterConfiguration setRegistryCenterConfiguration(final HttpSession session){
        UserAccount user = (UserAccount) session.getAttribute(SESSION_LOGIN_USER);
        RegistryCenterConfiguration registryCenterConfiguration = (RegistryCenterConfiguration)session.getAttribute(REG_CENTER_CONFIG_KEY + "_" + user.getUsername() );
        Collection<JobBriefInfo> data ;
        if (Objects.nonNull(registryCenterConfiguration)){
            // set regConfig
            jobAPIService.setRegistryCenterConfiguration(registryCenterConfiguration);
        }
        return registryCenterConfiguration;
    }

获取当前账户下的数据源配置

设置指定用户下连接dataSource的配置

修改文件:EventTraceDataSourceController.java

private static final String SESSION_LOGIN_USER = "session_login_user";
//设置用户数据连接session会话
private void setDataSourceNameToSession(final EventTraceDataSourceConfiguration dataSourceConfig, final HttpSession session) {
    UserAccount user = (UserAccount) session.getAttribute(SESSION_LOGIN_USER);
    String sessionKey = DATA_SOURCE_CONFIG_KEY.concat("_").concat(user.getUsername());
    //session.setAttribute(DATA_SOURCE_CONFIG_KEY, dataSourceConfig);
    session.setAttribute(sessionKey, dataSourceConfig);
    EventTraceDataSourceFactory.createEventTraceDataSource(dataSourceConfig.getDriver(), dataSourceConfig.getUrl(), dataSourceConfig.getUsername(), dataSourceConfig.getPassword());
    SessionEventTraceDataSourceConfiguration.setDataSourceConfiguration((EventTraceDataSourceConfiguration) session.getAttribute(sessionKey));
}

事件追踪数据源配置列表密码隐藏

删除列表密码展示列

修改文件:dataSource.vue

{
  label: this.$t('dataSource').addDialog.password,
  prop: 'password'
}

作业历史 /历史轨迹

1.每次调用API,先执行数据源初始化initDataSource方法

修改文件:EventTraceHistoryController.java

//@MedelAttribute 在此controller每个方法执行前被执行
@ModelAttribute
private void initDataSource() {
    eventTraceDataSourceConfigurationService.loadActivated().ifPresent(SessionEventTraceDataSourceConfiguration::setDataSourceConfiguration);
}

2.修改加载数据源的模式为从session会话中获取,会话信息按用户存储

//session缓存中获取,不从xml文件中加载
@Override
public Optional<EventTraceDataSourceConfiguration> loadActivated() {
    return Optional.ofNullable(getEventTraceDataSourceConfiguration());
    //return Optional.ofNullable(findActivatedDataSourceConfiguration(loadGlobal()));
}

项目启动加载数据源时,增加是否启用的判断逻辑

非启用状态下的数据源,不进行创建

修改文件:EventTraceDataSourceConfigurationServiceImpl.java

@Override
public void afterPropertiesSet() {
    for (EventTraceDataSourceConfiguration each : loadGlobal().getEventTraceDataSourceConfigurations().getEventTraceDataSourceConfiguration()) {
        if (!each.isActivated()){
            continue;
        }
        try {
            afterLoad(each);
        } catch (final JdbcDriverNotFoundException ex) {
            log.error("Consider manually adding JDBC Driver JAR to classpath.", ex);
        }
    }
}

注:其它为记录的修改项,以实际上传的工程源码为主;

功能展示

增加用户管理功能,可添加独立账户;

独立账户具有各功能操作权限,独立账户可对配置数据进行维护。如:添加注册中心配置,记录创建人账户;(root账户可操作所有)

独立账户新增配置中心数据后,只有当前用户可查看与维护;(root账户可操作所有)

新增数据源配置时记录创建者,只有当前用户可查看与维护。(root账户可操作所有)

扩展版-源码下载

Gitee下载:https://gitee.com/omsgit/shardingsphere-elasticjob-ui-3.0.0-rc1/

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部