本帖最后由 willning 于 2023-12-22 14:38 编辑
在企业级应用场景中,我们通常倾向于为每个公司部署独立的服务器环境,通过数据隔离的方式强加系统的安全性和可管理性。但是,对于一些集团型企业的标准化非核心应用场景(每个下属公司使用的方式相同)来说,为每个下属公司独立部署一套服务器环境,采购和维护成本更高,急切需要一种多个下属公司共享同一套服务器环境,但数据和权限保持隔离的解决方案,该方案必须要实现以下几点:
- 仅部署和维护一套服务器环境(网关、应用服务器、文件服务器、数据库服务器,具体可参考:最佳实践 )
- 每个下属公司有各自独立的应用入口和数据,原则上不互通;如果需要共享数据(例如,向集团填报汇总数据),也需要支持数据行权限控制
- 每个下属公司有自己的子管理员,仅允许查看和操作本公司的用户、组织结构,为自己公司的用户授予角色权限
- 每个下属公司的用户仅能看到自己公司的组织结构和用户清单,比如在工作流选人时,不能选其他兄弟公司的人
(点击查看大图)
具体而言,就是下面视频中这样。
(点击播放)
方案介绍
活字格支持为不同的应用配置不同的数据库连接字符串,所以,本方案的关键是利用第三方安全提供程序机制实现应用间的用户和组织结构隔离,以及通过用户管理V2插件实现“前端用户和组织结构管理”。方案由4部分组成,分工如下:
| 形态 | 用户 | 认证方式 | 作用 | 管理控制台 | 活字格内置管理控制台 | DevOps(集团IT开发岗) | 内置认证 | 管理和配置使用活字格开发的应用;管理安全设置 | 管理后台应用 | 使用活字格开发的应用 | 系统管理员(集团IT支持岗) | 普通认证 | 配置下属公司信息和相关策略 | 公司级业务应用(含子管理员功能) | 使用活字格开发的应用 | 子管理员(子公司IT岗)、子公司业务用户 | 第三方认证(应用级隔离) | 管理子公司的用户和组织结构,执行业务操作 | 总部级业务应用 | 使用活字格开发的应用 | 集团业务用户 | 普通认证 | 执行业务操作 |
四者的交互关系如下图所示:
(点击查看大图)
示例工程与源代码
示例的使用体验
1、系统初始化
特别提示:本环节操作需要对活字格的管理控制台有较深入的理解,且错误操作可能会导致系统无法正常运行,建议由具备活字格通用开发能力Level 3(至少参加过 面向程序员的入门课程 培训),并充分理解本方案的内容的DevOps人员谨慎执行。
首先,DevOps需要准备安装有活字格V9.0.102.0或更新版本的服务器环境,以及MySQL 8.0或更新版本的MySQL数据库(系统涉及到的数据库都运行在这一个数据库服务器上)。具体配置请参考最佳实践。
系统启用前,DevOps需要在管理控制台上完成初始化配置:
- 添加第三方安全提供程序,用于实现应用级用户信息隔离,最新版从 这里 获取
- 添加客户端认证信息,用于实现公司级业务应用与管理后台应用间的WebAPI安全调用
- 发布管理后台应用(含ManagementDb数据库,数据库初始化脚本为management_db.sql)
- 发布总部级业务应用(含CenterDb数据库,数据库初始化脚本为center_db.sql)
2、创建子公司
为新的公司启用应用时,需要系统管理员、DevOps和子管理员分工合作。其中DevOps的误操作可能导致系统无法正常运行,人员安排建议参考系统初始化环节。具体工作流程如下图所示。其中公司级应用数据库的初始化脚本为account_db.sql。
(点击查看大图)
除了公司的信息(中文简称,用于界面展示和英文简称,用于系统配置),主要配置项分为第三方安全提供程序和应用配置两组,具体如下
1、第三方→配置:
- 名称:建议设置为公司的英文简称,易于查找和辨识
- 自动同步间隔:建议为5分钟,时间过长意味着子管理员对用户的操作需要很长时间才能生效,过短则会对服务器性能带来不利影响
- 存放应用标识的自定义属性名称:固定为AvailableAccountId,与用户自定义属性的名称保持一致(自定义属性是应用发布时自动添加的)
- 该应用的标识:应用对应的公司ID,在管理后台应用的【公司管理】页面上可以查到
- 该应用的组织结构根节点:选择与公司名/简称一致的节点,在管理后台应用的【公司管理】页面上可以查到
2、应用管理→公司级业务应用:
- 常规设置→第三方:选择公司的英文简称,与【第三方】→配置匹配
- 全局变量→GLOBAL_CURRENT_ACCOUNT_ID:应用对应的公司ID,在管理后台应用的【公司管理】页面上可以查到
- 全局变量→GLOBAL_CURRENT_ACCOUNT_NAME:应用对应的公司的简称,会显示在页面的左上方
- 全局变量→MANAGEMENT_URL_PREFIX:管理后台应用的根地址,如http://localhost:9999/MAD_Management,因为应用部署在同一台服务器,仅需修改端口号和应用名
- 全局变量→MANAGEMENT_URL_CONNECT:活字格客户端鉴权的地址,因为应用部署在同一台服务器,固定为http://localhost:22345/UserService/connect/token
- 全局变量→MANAGEMENT_CLIENT_ID:管理后台应用中用户管理相关WebAPI的客户端访问ID,与系统初始化时创建的客户端认证信息保持一致,在管理控制台【设置】→【安全设置】中可以查到
- 全局变量→MANAGEMENT_CLIENT_SECRET:管理后台应用中用户管理相关WebAPI的客户端访问密钥
- 高级设置→数据库连接字符串AccountDb:应用对应的公司的专属数据库,通常在发布应用前已经通过数据库脚本创建完毕
- 高级设置→数据库连接字符串AccountDb:总部级业务应用的数据库,在系统初始化时创建
3、日常使用
日常使用时,系统管理员使用活字格管理控制台完成集团用户的创建和维护,子管理使用公司级业务应用的子管理员功能完成自己公司的用户创建和维护。子公司用户使用姓名+密码登录访问对应的公司级应用,集团总部用户使用用户名+密码访问总部级业务应用。
涉及的高级功能
示例工程中涉及到以下高级功能点,建议提前了解:
常见问题
Q1:不同企业的业务需求有99%一样,但1%有差异怎么处理?
为了对不同下属公司间业务的差异进行有效管理,尽量减少而不是扩大差异,来提升整体开发和运维效率,推荐开发者使用“全局变量”或数据库中的表来开发配置选项功能,根据不同的选项执行不同的业务逻辑或页面展现方式。如在开发阶段添加一个名为OPTION_XXX的全局变量,默认值为0,在管理控制台上为某个公司的应用设置为1;在业务逻辑处理时,读取OPTION_XXX,值为0时执行默认逻辑,为1时执行该公司的定制化逻辑。
Q2:开发时,活字格设计器中的环境该怎么配置?
为了确保开发环境与测试和生产环境尽可能一致,及时发现和处理与权限隔离有相关的Bug,提升开发效率,推荐开发者在开发时也启用该安全提供程序,尤其是涉及到子管理员相关功能的开发与维护时。具体做法如下,供参考。
1. 在本地安装活字格服务管理器
2. 参照本方案搭建一个简化版的测试环境,包含有安全提供程序、客户端认证信息、管理后台应用、总部级业务应用和一个用于测试的公司级业务应用和配套的数据库(版本与生产环境一致,如统一采用MySQL 8.0)
3. 在设计器中打开公司级应用,修改全局变量和数据库连接字符串中配置对应的信息,指向部署在本地的测试用应用和客户端认证信息
4. 在设计器中打开公司级应用的开发时管理控制台(绿控制台),添加安全提供程序,并配置为本地的测试用应用信息
5. 除非必要(如其他开发者添加了角色、用户自定义属性、全局变量等),不要在设计器中获取“应用设置”和“用户管理器”两个模块,否则需要重新执行3和4
Q3:我需要对接公司的CAS认证,没法同时用这个安全提供程序,怎么办?
活字格不支持为同一个应用设置两个安全提供程序,开发者必须在对接CAS(企微、泛微等也是同理)的安全提供程序代码中参考本方案中的安全提供程序代码,在UserInformations 属性的get访问器中实现用户、组织结构的过滤;并且通过Settings 属性的get访问器和相关方法为安全提供程序增加配置项目。
|