SlickOne 敏捷开发框架介绍(二) -- 多用户/多租户/SAAS软件基础框架实现

前言:在应用于集团版客户或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();var userID = userAccount.UserID;return userID;}lsm.getWebLogonCompanyID = function () {var userAccount = getWebLogonUserCookie();if (userAccount !== null) {var companyID = userAccount.CompanyID;return companyID;} else {return "";}}

 

2.4 登录验证后的票据存储

 用户登录之后,需要将其基本身份信息和关联的角色或权限数据存储下来。而且作为前后端分离的系统,服务端需要使用这些票据数据,前端也需要通过Cookie对象访问用户信息,作为权限控制的审核来源。

 //create form ticketFormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, loginName, DateTime.Now, DateTime.Now.AddMinutes(240),true, userDataContent, FormsAuthentication.FormsCookiePath);string ticString = FormsAuthentication.Encrypt(ticket);//write cookies in response//SetAuthCookie mark identity status trueHttpContext.Current.Response.Cookies.Add(new HttpCookie("SlickOneWebCookie", ticString));

 

3. Mvc页面及WebAPI安全访问

3.1 Mvc页面授权访问

页面控制器统一继承于页面基类,基类中重载方法OnActionExecuting(),读取用户身份信息,并存储到Session对象,如果是非授权用户,则跳转到登录页面。代码示例如下:

/// <summary>/// Authentication Verify When Action Executing/// </summary>/// <param name="filterContext"></param>protected override void OnActionExecuting(ActionExecutingContext filterContext){var attr = filterContext.ActionDescriptor.GetCustomAttributes(typeof(AllowAnonymousAttribute), true);bool isAnonymous = attr.Any(a => a is AllowAnonymousAttribute);if (isAnonymous == false){var session = filterContext.HttpContext.Session;this.SessionManager.SetSession(session);var user = this.SessionManager.GetLogonUser() as WebLogonUser;if (user == null){var webCookie = base.Request.Cookies["SlickOneWebCookie"];if (webCookie != null && !string.IsNullOrEmpty(webCookie.Value)){var encryptTicket = webCookie.Value;SaveUserSession(encryptTicket);}else{//Not a Valid Logon User, Need To Be Login Agaginvar formRedirectUrl = WebConfigurationManager.AppSettings["FormAuthenticationRedirectUrl"].ToString();string url = string.Format("{0}?ReturnUrl={1}", formRedirectUrl, Request.RawUrl);filterContext.HttpContext.Response.Redirect(url, true);}}}base.OnActionExecuting(filterContext);}

 

3.2 WebAPI 接口安全访问

 WebAPI控制器增加属性过滤器,用于验证是否是授权访问的接口,其中需要从Cookie中读取票据信息,验证审核用户是否是合法授权用户。

/// <summary>/// check authorizaton information when action executing/// </summary>/// <param name="actionContext"></param>public override void OnActionExecuting(HttpActionContext actionContext){//get authentication cookie from requestvar authCookie = actionContext.Request.GetCookie("SlickOneWebCookie");if (!String.IsNullOrEmpty(authCookie)){//decrypted user ticket informationif (ValidateUserTicket(authCookie))base.OnActionExecuting(actionContext);elseactionContext.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized);}else{//verify webapi security settingbool isRquired = (WebConfigurationManager.AppSettings["WebApiSecurityEnabled"].ToString() == "true");if (isRquired){//check anonymous attributevar attr = actionContext.ActionDescriptor.GetCustomAttributes<AllowAnonymousAttribute>().OfType<AllowAnonymousAttribute>();bool isAnonymous = attr.Any(a => a is AllowAnonymousAttribute);if (isAnonymous)base.OnActionExecuting(actionContext);elseactionContext.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized);}else{base.OnActionExecuting(actionContext);}}}

 4. 主界面操作说明

 主界面是整个后台数据维护的入口页面,集成了用户基础数据、流程数据、表单数据和其它设置页面。其中流程定义,表单定义都链接到不同的WEB应用程序地址,这些WEB应用程序统一实现SSO要求的FORM认证,统一登录地址等特性。保证一次登录,再次免验证就能访问各子系统的简捷操作。

 

5. 总结

SlickOne敏捷框架的示例项目,主要包括了基础数据的维护,业务系统集成访问,SSO单点登录实现,MVC页面安全和WebAPI安全访问等功能特性。作为企业级应用系统的开发,可以完全担当软件团队的技术统一框架解决方案。在后期的版本中,依然考虑企业用户的需求,增加和构建功能模块,做到框架软件的可扩展和二次开发。

6. DEMO

  1. 演示地址:http://gc.slickflow.com/sfadmin/
  2. 用户名和密码:admin/123456
  3. 流程设计器:http://gc.slickflow.com/sfd/
  4. 表单设计器:http://gc.slickflow.com/smd/

7. 社区版源代码

    SlickOne项目开源地址:

    http://github.com/besley/slickone 

8. 企业版授权说明

1) Demo仅作为功能演示使用,如需获取产品完整源代码和开发文档,请申请企业版商业授权。

2) QQ群:151650479

3) EMail: sales@ruochisoft.com

9. 参考

1. SlickOne 敏捷开发框架介绍(一)

转载于:https://www.cnblogs.com/slickflow/p/7867712.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/252762.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

工业相机行曝光与全局曝光

工业相机行曝光与全局曝光 逐行曝光&#xff1a; 图1 逐行曝光模式 逐行曝光sensor 实现如图1逐行曝光模式所示。与全局曝光不同&#xff0c;逐行曝光从第一行开始曝光&#xff0c;一个行周期之后第二行才开始曝光。依次类推&#xff0c;经过N-1 行后第N 行开始曝光。第一行曝光…

【Alpha阶段汇总】成果展示与体验总结

一、燃尽图 二、软件截图 三、代码与图片、音乐素材仓库 git仓库 四、问题与总结 1.git提交问题 之前创建的仓库地址是http://git.oschina.net/8265559926/groupnet14 但是无论怎么输入都说找不到仓库 经反复思考&#xff0c;感觉可能是因为地址不是纯字母的原因。就重新注册了…

JDBC批量操作性能提升

JDBC当使用INSERT INTO....VALUES()语句批量插入的时候&#xff0c;应该使用JDBC的PreparedStatement的批量操作方法&#xff0c;而不是採用一条一条运行的方法。比如&#xff08;来源&#xff1a;http://superjavason.iteye.com/blog/255423&#xff09;&#xff1a;如上图&am…

SVAC 2.0安全系统组成

SVAC2.0标准的一个很主要的特点就是视频安全和加密认证相比SVAC1.0更加规范&#xff0c;在视频安全方面更加重视。 通过信源层面的加密技术&#xff0c;实现端到端视频数据加密&#xff0c;构建更强大、更完整的视频安全体系。基于SVAC 2.0标准研究建立的安全系统&#xff08;…

【技术知识】SVAC 2.0安全技术浅析

2017-09-26 08:52 加密可以有效保护数据的机密性&#xff0c;防止非授权访问和非法监听。签名可以识别视音频的产生源以及所对应的视音频数据是否完整或被篡改。SVAC 2.0标准规定了加密和签名接口及数据格式&#xff0c;支持对数据的安全保护&#xff0c;以统一的语法格式支持…

别再管你的API叫微服务了

你有没有听过这句名言&#xff1a;“计算机科学领域只有两个难题&#xff0c;缓存失效和命名”&#xff1f;据说这句话是Phil Karlton在1996年或1997年左右说的。围绕这句格言确实出现了很多带有喜剧色彩的说法&#xff0c;它们也提到了其他的一些问题&#xff0c;但最近我对AP…

第一篇JavaScript基础

1.什么是JavaScript 2.核心语法&#xff0c;变量 先声明&#xff0c;再赋值 var i;i0; 同时声明并赋值变量 var x,y,z0; 不声明直接赋值u2&#xff08;变量可以不经过声明直接赋值&#xff0c;但是容易出错&#xff0c;这种方法不建议采纳&#xff09;3. 3.核心语法&#xff0…

透过迷雾不再迷茫 浅析海康威视透雾技术

频监控的需求主要分为两类&#xff0c;白天的需求和夜间的需求。夜间效果主要的提升之道以低照度和补光居多&#xff0c;也就造成了现在市面上白光补光、红外补光、激光补光等各式各样的摄像机盛行;非补光类的&#xff0c;当属星光级超级照度是为当下热门。而关于白天效果的提升…

抓包工具

前言&#xff1a; Charles是在 Mac 下常用的网络封包截取工具&#xff0c;在做移动开发时&#xff0c;我们为了调试与服务器端的网络通讯协议&#xff0c;常常需要截取网络封包来分析。 一、主界面介绍 二、网页抓包 启动 Charles 后&#xff0c;需要将 Charles 设置成系统代理…

详解Session分布式共享(.NET CORE版)

一、前言&回顾 在上篇文章Session分布式共享 Session Redis Nginx中&#xff0c;好多同学留言问了我好多问题&#xff0c;其中印象深刻的有&#xff1a;nginx挂了怎么办&#xff1f;采用Redis的Session方案与微软Session方案相比&#xff0c;有什么优势呢&#xff1f;Co…

浅析透雾监控镜头的四大透雾技术

透雾摄像机在雾天中的作用毋容置疑&#xff0c;YAMAKO透雾镜头早已获得用户的认可&#xff0c;如今&#xff0c;高清透雾摄像机的问世&#xff0c;很大程度上得益于透雾高清电动镜头&#xff0c;但摄像机本身的透雾原理也在近端时间获得极大的进步。 透雾技术主要分为四种&…

外网访问原理分析

本节我们会将上节创建的 ext_net 连接到 router&#xff0c;并验证内外网的连通性。 更重要的&#xff0c;我们会分析隐藏在表象之下的原理。 将外网连接到 Neutron 的虚拟路由器&#xff0c;这样 instance 才能访问外网。 点击菜单 Project -> Network -> Routers 进入 …

URAL1519 Formula 1 —— 插头DP

题目链接&#xff1a;https://vjudge.net/problem/URAL-1519 1519. Formula 1 Time limit: 1.0 secondMemory limit: 64 MBBackground Regardless of the fact, that Vologda could not get rights to hold the Winter Olympic games of 20**, it is well-known, that the city…

2018年中国视频监控行业发展空间巨大 AI技术赋能发展乃是未来必然趋势

https://bg.qianzhan.com/report/detail/459/190131-c2610ca0.html2019-2024年中国视频监控设备行业市场需求预测与投资战略规划分析报告2019-2024年中国安防行业市场前瞻与投资战略规划分析报告2019-2024年中国智能安防行业市场前瞻与投资战略规划分析报告2019-2024年中国智能…

FTP下载文件

今天公司有需求&#xff0c;需要从远程FTP服务器上下载文件到本地代码。然后看了一下&#xff0c;顺便做个记录 什么是FTP呢&#xff1f; 详细百度百科 FTP 是File Transfer Protocol&#xff08;文件传输协议&#xff09;的英文简称&#xff0c;而中文简称为“文传协议”。用…

2018年中国视频监控行业现状及行业发展趋势分析预测【图】

一、中国视频监控行业现状 中国 2013-2018 年模拟标清视频监控摄像机和模拟高清视频监控摄像机的复合增长率分别为-15.2%、 29.6%。 模拟标清视频监控摄像机需求量不断下降&#xff0c; 预计 2018 年同比下降 13%&#xff0c; 将下降到 0.38 亿台。 模拟高清视频监控摄像机需求…

C#中控制线程池的执行顺序

在使用线程池时&#xff0c;当用线程池执行多个任务时&#xff0c;由于执行的任务时间过长&#xff0c;会导制两个任务互相执行&#xff0c;如果两个任务具有一定的操作顺序&#xff0c;可能会导制不同的操作结果&#xff0c;这时&#xff0c;就要将线程池按顺序操作。下面先给…

MySQL触发器 trigger学习

触发器&#xff1a;一类特殊的事物。可监视某种数据操作&#xff0c;并触发相关操作&#xff08;insert/update/delete&#xff09;。表中的某些数据改变&#xff0c;希望同一时候能够引起其他相关数据改变的需求。 作用&#xff1a;变化自己主动完毕某些语句查询&#xff0c;加…

js调试笔记

js调试方法很多&#xff0c;今天总结一下最实用的的断点方法: debugger断点 这个很常见&#xff0c;但许多人不知道其实可以添加条件判断 if(something){debugger;} source断点 这个最为常见&#xff0c;不做过多解释&#xff0c;具体说一下几个重要图标: 恢复脚本执行至下一个…