在第三方系统用户集成文档中,介绍了三种同步用户到 Smartbi 系统中的方法。对于其中的第二种方法:在第三方系统中使用 Smartbi 用户管理的远程调用接口实现用户等信息的同步。我们还可以创建自定义计划任务,调用 SDK 接口方法,进行用户和机构信息同步。具体操作如下:
1、参考:任务 新建计划任务,任务类型”选择“定制”,然后将如下代码粘贴到代码编辑区。
“用户和机构自动同步”,自定义计划任务代码:
代码块 | ||||||
---|---|---|---|---|---|---|
| ||||||
importPackage(Packages.java.io); importPackage(Packages.java.lang); importPackage(Packages.java.util); importPackage(Packages.smartbi.usermanager); importPackage(Packages.smartbi.sdk); importPackage(Packages.smartbi.sdk.service.user); importPackage(Packages.smartbi.sdk.service.datasource); /** * 从外部数据库中定时同步用户、机构信息到知识库中 * * 代码说明: * 1)该同步代码默认会在"根组"下创建一个"顶级机构",所有同步过来的机构皆是其子机构 * 2)用户可以属于多个机构,多个机构名称之间用 # 号分割 */ var usrManagerService = new UserManagerService(connector); var datasrcService = new DataSourceService(connector); // // 创建"顶级机构" // 下面这段代码不能删除,如果不需要"顶级机构"可以将needTopGroup设置为false // var needTopGroup = true; // 是否创建一个"顶级机构" var topGroup = usrManagerService.getDepartmentById("DEPARTMENT"); if (needTopGroup) { topGroup = null; try { topGroup = usrManagerService.getDepartmentByName("YourTopGroupName"); //需要建立的顶级机构名称 } catch(e) {} if (!topGroup) { var groupId = usrManagerService.createDepartment("DEPARTMENT", "YourTopGroupName", "YourTopGroupName", "", ""); //在根组下建立顶级机构 topGroup = usrManagerService.getDepartmentById(groupId); } } // // 同步机构:获取第三方系统中的机构信息 // var sqlGroup = "select orgName, orgAlias, orgParentName, isUse, orgLevel from org order by orgLevel"; // 该SQL语句获取第三方系统中的机构信息 var gridDataGroup = datasrcService.executeNoCacheable("DS.northwind", sqlGroup); for (var i = 0; i < gridDataGroup.getRowsCount(); i++) { var orgName = gridDataGroup.get(i, 0).getValue(); var orgAlias = gridDataGroup.get(i, 1).getValue(); var orgParentName = gridDataGroup.get(i, 2).getValue(); var isUse = gridDataGroup.get(i, 3).getValue(); System.out.println("=====正在同步机构:名称/别名/父机构/是否生效:" + orgName + "/" + orgAlias + "/" + orgParentName + "/" + isUse); // 判断机构是否已经同步 var group = null; try { group = usrManagerService.getDepartmentByName(orgName); } catch(e) {} if (!group) { //如果不存在则创建 var parentGroup = null; try { parentGroup = usrManagerService.getDepartmentByName(orgParentName); } catch(e) {} if (!parentGroup) parentGroup = topGroup; usrManagerService.createDepartment(parentGroup.getId(), orgName, orgAlias, "", ""); } else { //如果存在则判断父机构是否正确 var parentGroup = null; try { parentGroup = usrManagerService.getDepartmentByName(orgParentName); } catch(e) {} if (parentGroup && (parentGroup.getId() != usrManagerService.getParentDepartment(group.getId()).getId())) { usrManagerService.moveDepartment(group.getId(), parentGroup.getId()); } } } // // 同步角色:获取第三方系统中的角色信息,orgName的意思是表示这个角色是建立在哪个组下的 // var sqlRole = "select roleName, roleAlias, orgName from roles"; // 该SQL语句获取第三方系统中的机构信息 var gridDataRole = datasrcService.executeNoCacheable("DS.northwind", sqlRole); for (var i = 0; i < gridDataRole.getRowsCount(); i++) { var roleName = gridDataRole.get(i, 0).getValue(); var roleAlias = gridDataRole.get(i, 1).getValue(); var orgName = gridDataRole.get(i, 2).getValue(); System.out.println("=====正在同步角色:名称/别名/父机构:" + roleName + "/" + roleAlias + "/" + orgName); var group = topGroup; if (orgName) { group = usrManagerService.getDepartmentByName(orgName); orgName = group.getId(); } // 判断角色是否已经同步 var role = null; try { role = usrManagerService.getRoleByName(roleName); } catch(e) {} if (!role) { //如果不存在则创建 usrManagerService.createRole(roleName, roleAlias, "", orgName); } else { //如果存在则判断父机构是否正确 usrManagerService.updateRole(role.getId(), roleAlias, ""); } } // // 同步用户:获取第三方系统中的用户信息 // var sqlUser = "select userName, userAlias, orgName, isUse, userPwd, roleName from orgUser"; // 该SQL语句获取第三方系统中的用户信息 var gridDataUser = datasrcService.executeNoCacheable("DS.northwind", sqlUser); for (var i = 0; i < gridDataUser.getRowsCount(); i++) { var userName = gridDataUser.get(i, 0).getValue(); var userAlias = gridDataUser.get(i, 1).getValue(); var orgName = gridDataUser.get(i, 2).getValue(); var isUse = gridDataUser.get(i, 3).getValue(); var userPwd = gridDataUser.get(i, 4).getValue(); var roleName = gridDataUser.get(i, 5).getValue(); System.out.println("=====正在同步用户:名称/别名/所属机构/是否生效/密码:" + userName + "/" + userAlias + "/" + orgName + "/" + isUse + "/" + userPwd); // 获取用户所属机构ID var usrOrgNameList = (orgName || "").split("#"); var usrOrgIdList = []; for (var j = 0; j < usrOrgNameList.length; j++) { var parentGroup = null; try { parentGroup = usrManagerService.getDepartmentByName(usrOrgNameList[j] || "NonEmptyOrgName"); if (parentGroup) usrOrgIdList.push(parentGroup.getId()); } catch(e) {} } if (usrOrgIdList.length < 1) usrOrgIdList.push(topGroup.getId()); // 判断用户是否已经同步 var user = usrManagerService.getUserByName(userName); if (!user) { // "123456" 是初始密码 usrManagerService.createUser(usrOrgIdList[0], userName, userAlias, "", "123456", ((isUse) ? true: false)); user = usrManagerService.getUserByName(userName); } // 设置用户所属机构 usrManagerService.assignDepartmentsToUser(user.getId(), usrOrgIdList); // 设置用户角色 var usrRoleNameList = (roleName || "").split("#"); var usrRoleIdList = []; for (var j = 0; j < usrRoleNameList.length; j++) { var userRole = null; try { userRole = usrManagerService.getRoleByName(usrRoleNameList[j]); if (userRole) usrRoleIdList.push(userRole.getId()); } catch(e) { } } usrManagerService.assignRolesToUser(user.getId(), usrRoleIdList); // 更新用户别名、描述等信息 // updateUser方法会将传入的明文密码,MD5后存入smartbi知识库 //usrManagerService.updateUser(user.getId(), userAlias, "", userPwd, ((isUse) ? true: false)); // // 或者,调用updateUserByEncryptedPassword方法同步密码 // 在第三方系统密码的前面添加标识:"0" + MD5; "1" + DES; "2" + 明文密码 //如果第三方系统中用户密码是以MD5加密的方式储存的,则需要在密码前加"0",方可正常登陆 //如果第三方系统中用户密码是以DES加密的方式储存的,则需要在密码前加"1",方可正常登陆 //如果第三方系统中用户密码是明文存储的,则需要在密码前加"2",方可正常登陆 var encryptedPwd = "0" + userPwd; usrManagerService.updateUserByEncryptedPassword(user.getId(), userAlias, "", encryptedPwd, ((isUse) ? true: false)); } // // 同步完成! // System.out.print("\n\n\n\n\n========================================"); |
提示 |
---|
注意:请参考代码中的注视,修改其中的必要信息,比如下面这些。
|
2、保存创建的任务,然后点击“新建计划”按钮,创建一个执行计划,设置定时执行同步任务。
3、示例资源:下载地址。
4、根据自己的实际情况对代码进行修改。