前言:在应用于集团版客户或SAAS平台服务的业务系统中,流程管理系统需要支持多用户组织模型。其中包括角色数据、流程定义数据和流程实例数据的多用户标识绑定。本文旨在全面描述如何基于SlickOne敏捷开发框架实现上述基础服务功能,形成一个完整的支持多用户查看和维护各自流程数据的管理后台系统。
1. 基础数据的多用户标识
1.1 多用户(公司)数据表
数据库表SysCompany用来存储多用户/多租户的基本信息,字段CompanyID 用来标识后期业务数据的所有者。
1.2 角色/用户数据表
角色用户表统一增加CompanyID字段,用来确定角色和用户属于具体的那一个用户或租户。
1.3. 流程定义数据的多用户标识
数据库表WfProcess增加CompanyID字段,用来标识流程定义属于那一个用户或租户。
1.4. 流程实例数据的多用户标识
所有的流程实例数据,统一增加CompanyID字段,用了标识流程实例数据的拥有者范围。
2. 多站点类型的SSO功能实现
多站点SSO单点登录功能的实现,便于统一整合不同子系统的数据管理和维护;尤其对于平台级别的软件产品,多个子系统的是需要经常频繁操作访问的。所以,一次登录,再次免验证,就非常方便简捷。
2.1 系统环境配置
1) Form 认证方式配置
<authentication mode="Forms"> <forms loginUrl="http://localhost/sfadmin/Account/Login" protection="All" timeout="240" name=".AuthCookie" /> </authentication>
2) Session 状态存储配置
<sessionState mode="InProc" customProvider="DefaultSessionProvider" timeout="480"> <providers> <add name="DefaultSessionProvider" type="System.Web.Providers.DefaultSessionStateProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="DefaultConnection" /> </providers> </sessionState>
3) MachineKey 配置
<machineKey validationKey="zsdgfdg3FF1B0F88DDF585BA5D35E7BC87E3F0AB47FBBEBD12240DD3BEA2BEAEC4ABA215478658ugfjnhgfnmj3F22AD27E8FAD77DCFEE306219691434908D193A17C1FC8DCE51B71A4AE54920" decryptionKey="ECB6A3AF9ABBF3F16E80685ED68DC74B0B13CCEE538EBBA97D0B893139683B3B" validation="SHA256" decryption="AES" />
4) 登录页面重定向地址
<add key="FormAuthenticationRedirectUrl" value="http://localhost/sfadmin/Account/Login"/>
2.2 Session 对象操作和访问
用于服务端用户对象的身份信息存储,包括用户ID标识,用户名称,公司ID标识,票据信息和权限数据等。
/// <summary> /// 获取登录用户ID /// </summary> /// <param name="session"></param> /// <returns></returns> public int GetLogonUserID() { return (int)Get(WEB_LOGON_USER_ID); } public int GetLogonCompanyID() { return (int)Get(WEB_LOGON_COMPANY_ID); } /// <summary> /// 获取登录用户Session的GUID /// </summary> /// <param name="session"></param> /// <returns></returns> public string GetLogonUserSessionGUID() { return Get(WEB_LOGON_SESSION_GUID).ToString(); } /// <summary> /// 获取登录用户票据 /// </summary> /// <param name="session"></param> /// <returns></returns> public string GetLogonUserTicket() { var obj = Get(WEB_LOGON_USER_TICKET); var ticket = obj != null ? obj.ToString() : string.Empty; return ticket; }
2.3 Cookie 对象操作和访问
前端JS脚本访问用户的特定信息,通过Cookie对象获取来实现,大致代码如下:
function getWebLogonUserCookie() { var name = "SlickOneWebLogonUserDataCookie"; var cookie = getCookie(name); if (cookie !== undefined) { var userAccount = $.parseJSON(cookie); return userAccount; } else { return null; } } lsm.getWebLogonUserID = function () { var userAccount = getWebLogonUserCookie();