1.角色权限模块1.1RBAC概述RBAC通过定义角色的权限来控制用户的权限,并赋予用户一定的角色来控制用户的权限,实现了用户和权限的逻辑分离(区别于ACL模型),大大方便了权限的管理。在解释之前,先介绍一些名词:用户(user):每个用户都有唯一的UID标识,被赋予不同的角色。Role(角色):不同的角色有不同的权限Permission:访问权限User-rolemapping:用户与角色的映射关系Role-permissionmapping:角色与权限的映射1.2当前系统设计权限体系越来越复杂,需求方提出支持多维授权,比如研发部门的员工可以访问gitlab;java开发工程师可以访问的跳板;杭州员工可以看到亚运信息;只有P6及以上级别才能看到公司的利润报告。结果,系统的授权变得越来越复杂。更重要的是,只有研发部门的领导才能看到当前部门研发成员的基本信息……多标签模型权限设计(标签是支持授权的字段,维度也可以叫标签)由于通常会赋予用户某种类型的权限,因此提炼出权限组的概念。权限组是单个权限的集合。当前系统:查询权限的逻辑为1.查询EmployeeRoleMap表获取角色集roleIdsselectroleIdsfromEmployeeRoleMapwhereemployeeId=?ROLE)从权限中选择menuUID、menuGroupId,其中[roleIds...]中的值和密钥=RoleDimssionKey.ROLE3。如果menuGroupId(权限组id)存在,则查询menu_group_mapping(权限-权限组关联表),获取该组关联的所有权限menuUIDselectmenuUID,menuGroupIdfrommenu_group_mappingwheremenuGroupIdin[...]4.根据查询所有MenusmenuUID(如果第3步有menuId,一起查询)select*frommenu_group_mappingwheremenuIdin[...]权限组相关逻辑为权限组配置(运营平台)商品spu绑定menuGroup属性(临时解决,建议后期剥离商品属性,直接绑定对应的spu和权限组)。用户购买商品并支付成功后,后台逻辑会查询当前sku绑定的指定菜单组,并添加到权限(tag-权限关联表)insertintopermission(KEY=ROLEDIMISSION.ROLEID,value=?,MENUGROUPID=?DATA_BI_MENU_GROUP_ID?)2.sku商品价格计算为防羊毛,0元商品价格只能购买一次2.1新用户NoneUpgradeSkuFilter可以直接查询sku商品价格2.2升级账户数量UpgradeAccountSkuFilterlocktime=最接近当前套餐的时间,账号数大于当前套餐账号2.3升级时间UpgradeTimeSkuFilter锁定账号数等于当前套餐套餐账号的套餐代码逻辑为1.查询organization_pay购买时ment_detail表,判断购买类型(购买成功会更新organization_payment_detail)organization_payment为空(新用户)前端显示购买按钮,organization_payment(过期或购买状态)前端显示升级时长和升级accountbutton2.前端发起查询sku请求,并携带购买类型参数,后端根据购买类型判断filter,过滤商品并计算价格(如NoneUpgradeSkuFilter、UpgradeAccountSkuFilter、UpgradeTimeSkuFilter)。相应的购买类型如UpgradeAccountSkuFilter负责产品过滤和价格计算。计算逻辑为补差价(实际价格=应付价格-差价)套餐A1个月10件10元套餐B1个月20件20元套餐C1个月30件30元套餐D4个月10件40元套餐E5个月10元每个50元1.路人A用户升级账号案例1假设今天是09-15,如果你在09-01购买套餐A,可以升级到套餐B\C。如果购买套餐B,价格为(20/30(30-15))-10/30x15=5元可简化为需补差15天(30-15)x(20/30-10/30)=5元,当前(套餐变成09-15---->09-20号30号)2.路人A用户升级时间case1假设今天是09-15,如果买套餐A在09-01可以升级到套餐D\E,购买D的价格为40-10元/30天*15天未使用天数=(40-10/30x15)=35元,当前套餐变成09-15---->09-15和10个账号购买09-15后4个月的E价为50元-10元/30天*未使用天数15天=(50-10/30x15)=45元,当前包变为09-15---->09-15后5个月10个账户3.AD模块3.1AD域控制基础AD是windows电脑远程登录的账户管理中心。开启远程应用后,会为每个数字用户分配一个独立的办公空间,即创建一个AD账号。AD账户创建是通过java调用powershell命令行实现的3.2连接池模拟C3P0连接池、线程池等原理,实现可复用的powershell连接池需求分析:目前系统powershell主要用于辅助DDC机和AD-相关资源CRUD和其他辅助powershell命令。由于连接了AD域控,可以远程运行powershell。因此,我们期望部署在DDC01机器上的agent可以直接控制本机powershell和app01\addc01的运行。输入参数:机器名,脚本脚本Powershell:远程执行,本地执行IRecycle可重用对象。id作为唯一标识,reset方法重置所有属性ObjectPool抽象可重用资源池,使用LinkedBlockingQueue作为容器防止多线程并发安全问题DefaultRecyclePowerShellFactorypowershell连接池+StringgetId();+voidreset();销毁当前powershellsessionContextRemove-Variable*-ErrorActionSilentlyContinue-Exclude@(...)DefaultRecyclePowerShellpowershell可重用对象4.与传统HTTP相比,websocket模块的每次请求-响应都需要客户端与服务器。WebSocket类似于Socket的TCP长连接通信方式。WebSocket连接建立后,后续数据以帧序列的形式传输。握手阶段a。浏览器与服务器建立TCP连接并握手3次。这是通信的基础,如果传输控制层失败,将不会执行。b.TCP连接成功后,浏览器通过HTTP协议向服务器发送WebSocket支持的版本号等信息。(开始前的HTTP握手)c.服务器端收到客户端的握手请求后,同样使用HTTP协议反馈数据。d.收到连接成功报文后,通过TCP通道进行传输和通信。客户端发送消息:GET/chatHTTP/1.1Host:server.example.comUpgrade:websocketConnection:UpgradeSec-WebSocket-Key:dGhlIHNhbXBsZSBub25jZQ==Origin:http://example.comSec-WebSocket-Version:13服务器返回一个message:HTTP/1.1101SwitchingProtocolsUpgrade:websocketConnection:UpgradeSec-WebSocket-Accept:s3pPLMBiTxaQ9kYGzzhZRbK+xOo=技术选择:nativewebsocketspringbootwebsocket(轻量级,spring集成,开发成本低)Stomp(类似springstreammessage,springboot协议websocket,前端需要使用SOCKJS)NettySocketIO(轻量级,性能好,前端需要引入socket.io.js)springwebsocket主要组件WebSocketConfigurerwebsocket配置类:添加消息处理器和握手拦截器voidregisterWebSocketHandlers(WebSocketHandlerRegistryregistry)等作为注册表.addHandler(agentWSHandler(),"/api/v1/websocket/dsAgent").setAllowedOrigins("*").addInterceptors(agentWSInterceptor);TextWebSocketHandler文本消息处理器voidafterConnectionEstablished(WebSocketSessionsession)voidhandleMessage(WebSocketSessionsession)连接建立成功后session,WebSocketMessage>message)接收客户端推送的消息voidafterConnsectionClosed(WebSocketSessionsession,CloseStatusstatus)连接断开前HandshakeInterceptorbeforeHandshake(ServerHttpRequestrequest,ServerHttpResponseresponse,WebSocketHandlerwsHandler,Map
