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.pswp.cn/news/252762.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/252762.shtml
英文地址,請注明出處:http://en.pswp.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;感覺可能是因為地址不是純字母的原因。就重新注冊了…

Accusoft結構化工具包FormSuite for Structured Forms常見問題解答(二)

FormSuite for Structured Forms是結構化的表單處理SDK和字符識別工具套包&#xff0c;包括表單處理工具FormFix和字符識別工具SmartZone。所有表格處理控件被設計為可以通過內存到內存的數據傳輸模式進行相互溝通。本文收集了一些FormSuite for Structured Forms常見問題及解答…

構建之法閱讀筆記二

構建之法閱讀筆記之二&#xff08;4-11章節&#xff09; 在這之前我不注重代碼的規范性&#xff0c;也不是很注重代碼風格的規范&#xff0c;也沒有對自己寫的代碼進行審查的過程 根據書中所講的這樣寫即使是自己的能力很強&#xff0c;寫的代碼只有自己可以看懂&#xff0c;別…

SVAC國家標準介紹

[摘要] 標準給人的感覺既熟悉又陌生;說熟悉&#xff0c;每天都會聽到這個名詞;從食品衛生到高科技&#xff0c;好像都離不開;說陌生&#xff0c;標準的數量以萬計&#xff0c;包羅萬象&#xff0c;其內容和目標鮮為人知。以SVAC標準來說&#xff0c;粗看內容和H.264等標準和差不…

JDBC批量操作性能提升

JDBC當使用INSERT INTO....VALUES()語句批量插入的時候&#xff0c;應該使用JDBC的PreparedStatement的批量操作方法&#xff0c;而不是採用一條一條運行的方法。比如&#xff08;來源&#xff1a;http://superjavason.iteye.com/blog/255423&#xff09;&#xff1a;如上圖&am…

python學習筆記第9天《文件的管理辦法》

1&#xff0c;文件路徑&#xff1a; 絕對路徑&#xff1a;d:\programfiles\python3.exe 即從根目錄開始一直向下找到的文件 相對路徑&#xff1a;從當前文件路徑開始的路徑名稱2&#xff0c;編碼方式&#xff1a;utf-8,gbk,unicode等等 文件是用什么格式寫…

SVAC 2.0安全系統組成

SVAC2.0標準的一個很主要的特點就是視頻安全和加密認證相比SVAC1.0更加規范&#xff0c;在視頻安全方面更加重視。 通過信源層面的加密技術&#xff0c;實現端到端視頻數據加密&#xff0c;構建更強大、更完整的視頻安全體系。基于SVAC 2.0標準研究建立的安全系統&#xff08;…

【MySQL】(4)操作數據表中的記錄

1. 插入記錄INSERT 方法一&#xff1a; INSERT [INTO] tbl_name [(clo_name,...)] {VALUES | VALUE} ({expr | DEFAULT},...),(...),...; 比如&#xff1a; CREATE TABLE users( id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT, username VARCHAR(20) NOT NULL, password VA…

【技術知識】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 設置成系統代理…

【Python數據分析】魔術命令(Magic Command)

IPython有一些特殊的命令&#xff08;被稱為魔術命令&#xff09;&#xff0c;他們有的為常見的任務提供便利&#xff0c;有的則使你能夠輕松的控制IPython系統的行為 魔術命令是以百分號%為前綴的命令 常用的IPython魔術命令 命令 說明 %quickref 顯示IPytho…

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

一、前言&回顧 在上篇文章Session分布式共享 Session Redis Nginx中&#xff0c;好多同學留言問了我好多問題&#xff0c;其中印象深刻的有&#xff1a;nginx掛了怎么辦&#xff1f;采用Redis的Session方案與微軟Session方案相比&#xff0c;有什么優勢呢&#xff1f;Co…

淺析透霧監控鏡頭的四大透霧技術

透霧攝像機在霧天中的作用毋容置疑&#xff0c;YAMAKO透霧鏡頭早已獲得用戶的認可&#xff0c;如今&#xff0c;高清透霧攝像機的問世&#xff0c;很大程度上得益于透霧高清電動鏡頭&#xff0c;但攝像機本身的透霧原理也在近端時間獲得極大的進步。 透霧技術主要分為四種&…

globals() 和 locals() 函數

globals() 和 locals() 函數 根據調用地方的不同&#xff0c;globals() 和 locals() 函數可被用來返回全局和局部命名空間里的名字。 如果在函數內部調用 locals()&#xff0c;返回的是所有能在該函數里訪問的命名。 如果在函數內部調用 globals()&#xff0c;返回的是所有在該…

SpringMVC的filter怎么使用Autowired依賴注入bean

有的時候根據我們業務的需要&#xff0c;我們需要在web項目中定義一個自己的filter,并想在這個filter中使用Autowired注入bean供我們使用。如果直接使用的話是不行的&#xff0c;需要我們在xml文件中進行配置。下面就根據我的一個項目寫一個示例:步驟一、定義一個ClientSession…

RunDll32.exe 詳解及[Windows批處理]清除IE緩存

Rundll32命令詳解 文件作用&#xff1a;執行32位DLL文件中的內部函數 位置&#xff1a;X:&#xff08;當前系統分區)\windows\system32 命令語法&#xff1a; Rundll32.exe DLLname,Functionname [Arguments] 實例&#xff1a; RunDll32.exe InetCpl.cpl,ClearMyTracksByProces…