帳號與權限元件透過介面 ICustomEmployeeAuthorizationResult 開放給外部元件自訂帳號授權結果,透過這個介面取得作業選項子項目的擁有者資訊做為權限判斷條件,或者是取回外部元件自訂的權限判斷結果取代原本的結果值。
下列為帳號與權限元件初始化授權結果的程式碼,
/// <summary> /// 初始化最上層頁面授權結果 /// </summary> public void InitialAuthorizationResultOfTopPage() { InitialAuthorizationResult(true); } /// <summary> /// 初始化下層頁面授權結果 /// </summary> public void InitialAuthorizationResultOfSubPages() { InitialAuthorizationResult(false); } /// <summary> /// 初始化授權結果 /// </summary> protected virtual void InitialAuthorizationResult(bool isTopPageOfOperation) { this.isTopPageOfOperation = isTopPageOfOperation; //取得指定作業代碼的後端身分可使用權限 IDataAccessCommand cmd = DataAccessCommandFactory.GetDataAccessCommand(DBs.MainDB); spEmployeeRoleOperationsDesc_GetDataOfOp cmdInfo = new spEmployeeRoleOperationsDesc_GetDataOfOp() { OpId = opIdOfPage, RoleName = roleName }; DataSet dsRoleOp = cmd.ExecuteDataset(cmdInfo); //從資料集載入身分的授權設定 LoadRoleAuthorizationsFrom(dsRoleOp); if (custEmpAuthResult != null) { //自訂帳號授權結果 EmployeeAuthorizationsWithOwnerInfoOfDataExamined authAndOwner = custEmpAuthResult.InitialAuthorizationResult(isTopPageOfOperation, authorizations); ownerAccountOfDataExamined = authAndOwner.OwnerAccountOfDataExamined; ownerDeptIdOfDataExamined = authAndOwner.OwnerDeptIdOfDataExamined; this.authorizations = authAndOwner; if (authAndOwner.IsTopPageOfOperationChanged) { this.isTopPageOfOperation = authAndOwner.IsTopPageOfOperation; } return; } }
Line 1~15: InitialAuthorizationResultOfTopPage() 與 InitialAuthorizationResultOfSubPages() 的差別只在 this.isTopPageOfOperation 是 true 或 false。
Line 24~35: 依照目前的作業選項代碼 opId 和登入者的身分 roleName 從資料庫取得授權設定並且暫存。
Line 37~51: 本篇重點,客製化權限判斷。
Line 40: 將暫存的授權設定提供給外部元件,取回自訂帳號授權結果。
Line 41, 42: 暫存外部元件提供的擁有者資訊。
Line 43: 使用外部元件提供的授權設定,取代暫存的授權設定。
(類別 EmployeeAuthorizationsWithOwnerInfoOfDataExamined 繼承自 EmployeeAuthorizations)
Line 45~48: 如果外部元件有更改 isTopPageOfOperation 值,改用外部元件指定的值。
(例如:帳號與權限元件原本被指定以「作業選項」的授權值做權限判斷,但是外部元件認為要改用「作業選項的子項目」的授權值做權限判斷)
上述 Line 41, 42 取得的擁有者資訊,會被用在 CanEditThisPage() ,以下為 CanEditThisPage() 的程式碼,
/// <summary> /// 檢查是否可編輯此頁面 /// </summary> public virtual bool CanEditThisPage() { return CanEditThisPage(isTopPageOfOperation, ownerAccountOfDataExamined, ownerDeptIdOfDataExamined); } /// <summary> /// 檢查是否可編輯此頁面 /// </summary> public virtual bool CanEditThisPage(bool useTopRule, string ownerAccount, int ownerDeptId) { bool result = false; if (useTopRule) { result = authorizations.CanEdit; } else { if (authorizations.CanEditSubItemOfOthers) { result = true; } else if (authorizations.CanEditSubItemOfCrew && deptId > 0 && deptId == ownerDeptId) { result = true; } else if (authorizations.CanEditSubItemOfSelf && empAccount != "" && empAccount == ownerAccount) { result = true; } } return result; }
Line 6: 使用暫存的擁有者資訊做為條件做權限判斷。
以上為介面 ICustomEmployeeAuthorizationResult 在帳號與權限元件之中的作用。
接著說明實作介面 ICustomEmployeeAuthorizationResult 的外部元件需負責的工作,
以「帳號管理」專屬的管理頁共用元件 AccountCommonOfBackend 為例,下列為實作介面的程式碼,
[Description("後台帳號管理頁的共用元件")] public class AccountCommonOfBackend : BackendPageCommon, ICustomEmployeeAuthorizationResult { // ...略... #region ICustomEmployeeAuthorizationResult public EmployeeAuthorizationsWithOwnerInfoOfDataExamined InitialAuthorizationResult(bool isTopPageOfOperation, EmployeeAuthorizations authorizations) { EmployeeAuthorizationsWithOwnerInfoOfDataExamined authAndOwner = new EmployeeAuthorizationsWithOwnerInfoOfDataExamined(authorizations); if (!isTopPageOfOperation) { // get owner info for config-form IDataAccessCommand cmd = DataAccessCommandFactory.GetDataAccessCommand(DBs.MainDB); spEmployee_GetAccountOfId cmdInfo = new spEmployee_GetAccountOfId() { EmpId = qsEmpId }; string errCode = "-1"; string empAccount = cmd.ExecuteScalar<string>(cmdInfo, errCode); string dbErrMsg = cmd.GetErrMsg(); DataSet ds = null; if (empAccount != errCode) { accountOfData = empAccount; spEmployee_GetData cmdInfoGetData = new spEmployee_GetData() { EmpAccount = empAccount }; ds = cmd.ExecuteDataset(cmdInfoGetData); dbErrMsg = cmd.GetErrMsg(); if (ds != null && ds.Tables[0].Rows.Count > 0) { DataRow drFirst = ds.Tables[0].Rows[0]; authAndOwner.OwnerAccountOfDataExamined = drFirst.ToSafeStr("OwnerAccount"); authAndOwner.OwnerDeptIdOfDataExamined = Convert.ToInt32(drFirst["OwnerDeptId"]); } } } return authAndOwner; } #endregion }
Line 10: 預設要回傳的授權結果 EmployeeAuthorizationsWithOwnerInfoOfDataExamined 物件,預設值同傳入的 EmployeeAuthorizations 物件。
Line 12: 若使用的是「作業選項的子項目」的規則,才需要去資料庫取得擁有者資訊。
Line 15~23: 使用網址參數 EmpId 到資料庫取得對應的帳號 EmpAccount。
Line 28: 暫存取回的 EmpAccount,預留給其他功能。
Line 29~43: 使用 EmpAccount 到資料庫取得帳號的擁有者資訊,並且放入要回傳的結果物件裡。
Line 47: 回傳結果。
總結外部元件需負責的工作有兩項,
- 回傳的授權結果 EmployeeAuthorizationsWithOwnerInfoOfDataExamined 物件不管外部元件有無更改授權設定值,一定要有回傳值。若沒有更改授權設定值,要從傳入的 EmployeeAuthorizations 物件複製相同的值再回傳。
- 負責取得展示層網頁程式指定的「作業選項的子項目」資料擁有者資訊。
沒有留言:
張貼留言