.NET之許可權管理

来源:http://www.cnblogs.com/androidshouce/archive/2016/06/14/5582722.html
-Advertisement-
Play Games

序:在功能性比較強大的後臺管理網站處於各種角度考慮多有應用許可權管理功能。以公司內部管理系統為例,管理員根據不同員工所在不同部門賦予其不同許可權,或者根據上下級隸屬關係實現“金字塔”管理(註:本次所授許可權管理為不可動態編輯模式,即無法進行二級以上許可權分割)。本文內容有不盡不實之處懇請指正。 正文:如下效 ...


序:在功能性比較強大的後臺管理網站處於各種角度考慮多有應用許可權管理功能。以公司內部管理系統為例,管理員根據不同員工所在不同部門賦予其不同許可權,或者根據上下級隸屬關係實現“金字塔”管理(註:本次所授許可權管理為不可動態編輯模式,即無法進行二級以上許可權分割)。本文內容有不盡不實之處懇請指正。

正文
如下效果圖是否令某用戶具備相應許可權用checkbox狀態區別存儲。

(一)儲存
這裡的許可權功能(類別)名稱和許可權模塊(具體)名稱均是手動輸入資料庫,不可增刪改查。本例將某許可權模塊作為最基本元素,是否具備該許可權用1或0表示,進而將當前用戶所有許可權鏈接組成二進位字元串儲存在資料庫中。如示例代碼1.1

(二)讀取 如示例代碼1.2

(三)前臺代碼 如下

複製代碼
//利用js添加逗號和豎線 ,通過hidden傳值

<script language="javascript" type="text/javascript">

function getcheck() {
var inputs = document.getElementById("cbpanel");
var chks = inputs.getElementsByTagName("input");
var str = "";
for (var i = 0; i < chks.length; i++) {
if (chks[i].type == 'checkbox') {
str += chks[i].value + "," + chks[i].checked + "|";
}
}
document.getElementById("Hidden1").value = str;
}

<script>

<body>

<div id="cbpanel"> <asp:Literal ID="LiteralRole" runat="server"></asp:Literal>

<input id="Hidden1" runat="server" type="hidden" /></div>

</body>
複製代碼 複製代碼
示例代碼1.2
 /// <summary>
         /// 綁定所有模塊分類
         /// </summary>
         private void BindAllModule()
         {
             StringBuilder sb = new StringBuilder();
             sb.Append("<table class=\"AddRole\" width=\"100%\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\">");
             Bll_User_Module mbll = new Bll_User_Module();
             IList<User_Model.Model_User_Module> list = mbll.GetAllList();//得到泛型集合
              string moduleidstr = "";
              for (int i = 0; i < list.Count; i++)
              {
                  sb.Append("<tr><th style=\"width: 100px; height: 36px;\">");
                  sb.Append(list[i].ModuleName);
                  sb.Append("</th>");
                  sb.Append("<td>");
                  sb.Append("{" + list[i].ID + "}");
                  sb.Append("</td></tr>");
                  moduleidstr += list[i].ID.ToString() + ",";
              }
              sb.Append("</table>");
 
              if (Request.QueryString["nid"] != null)
              {
                  //修改
                  BLL_User_Role mrbll = new BLL_User_Role();
 
                  User_Model.Model_User_Role mrmodel = mrbll.GetModel(Convert.ToInt32(Request.QueryString["nid"]));
                  string RoleActions = mrmodel.RoleAction;
                  BindAllFunction(moduleidstr, sb, RoleActions);
              }
              else
              {
                  //新增
                  BindAllFunction(moduleidstr, sb, "");
              }
         }
         /// <summary>
         /// 綁定每個模塊中的各個功能選項
         /// </summary>
         /// <param name="moduleidstr">模塊數</param>
         /// <param name="sb">html表格</param>
         /// <param name="RoleActions">許可權二進位字元串</param>
         private void BindAllFunction(string moduleidstr, StringBuilder sb, string RoleActions)
         {
             Bll_User_Function bll = new Bll_User_Function();
             IList<User_Model.Model_User_Function> list = bll.GetAllList();//功能表泛型集合
             moduleidstr = moduleidstr.TrimEnd(',');//用逗號間隔功能模塊數
             string[] str = moduleidstr.Split(',');//移除逗號,以數組形式保存
             for (int i = 0; i < str.Length; i++)//迴圈數組
             {
                 StringBuilder funsb = new StringBuilder();
                 for (int j = 0; j < list.Count; j++)
                 {
                     if (list[j].ModuleNo == Convert.ToInt32(str[i]))
                     {
                         if (RoleActions == "")
                         {
                             //新增
                             funsb.Append("<input id=\"" + list[j].FuncNo.ToString() + "\" type=\"checkbox\" checked=\"checked\" value=\"" + list[j].FuncNo.ToString() + "\" />");
                             funsb.Append(list[j].FuncName + "&nbsp;&nbsp;");
                         }
                         else
                         {
                             //修改
                             if (RoleActions.Length >= list[j].FuncNo)
                             {
                                 //FuncNO代表當前許可權位於二進位字元索引值
                                 if (RoleActions.Substring(list[j].FuncNo - 1, 1) == "1")//截取許可權二進位字元串並判斷其狀態
                                 {
                                     //選中狀態
                                     funsb.Append("<input id=\"" + list[j].FuncNo.ToString() + "\" type=\"checkbox\" checked=\"checked\" value=\"" + list[j].FuncNo.ToString() + "\" />");
                                     funsb.Append(list[j].FuncName + "&nbsp;&nbsp;");
                                 }
                                 else
                                 {
                                     //非選中狀態
                                     funsb.Append("<input id=\"" + list[j].FuncNo.ToString() + "\" type=\"checkbox\" value=\"" + list[j].FuncNo.ToString() + "\" />");
                                     funsb.Append(list[j].FuncName + "&nbsp;&nbsp;");
                                 }
                             }
                             else
                             {
                                 funsb.Append("<input id=\"" + list[j].FuncNo.ToString() + "\" type=\"checkbox\" value=\"" + list[j].FuncNo.ToString() + "\" />");
                                 funsb.Append(list[j].FuncName + "&nbsp;&nbsp;");
                             }
                         }
                     }
                 }
                 //替換功能項
                 sb.Replace("{" + str[i] + "}", funsb.ToString());
             }
             LiteralRole.Text = sb.ToString();      
         }
 
 // 保存(更新)事件
 protected void Submit_Click(object sender, EventArgs e)
 {
 string cbstr = Hidden1.Value;//獲取前臺hidden傳值,如 “1,true|2,true|3,false|4,true”形式
 
 ........
 
 }
複製代碼 複製代碼
示例代碼1.1 
 /// <summary>
         /// 生成角色二進位字元串
         /// </summary>
         /// <param name="str"></param>
         /// <returns>二進位序列</returns>
         private string GenerateRoleAction(string str)
         {
            //虛擬表構建兩列存儲許可權序列號及其狀態
             DataTable dt = new DataTable();
             DataColumn col1 = new DataColumn("funno", typeof(int));
             dt.Columns.Add(col1);
             DataColumn col2 = new DataColumn("flag");
             dt.Columns.Add(col2);
 
             string[] strarray = str.TrimEnd('|').Split('|');//截取任意兩個二進位元素之間豎線
             for (int i = 0; i < strarray.Length; i++)
             {
                 DataRow dr = dt.NewRow();
                 dr[0] = strarray[i].Split(',')[0];//許可權序列號
                 dr[1] = strarray[i].Split(',')[1];//許可權狀態,用true和false區別記錄
                 dt.Rows.Add(dr);
             }
 
             dt.DefaultView.Sort = "funno asc";
             DataTable dttemp = dt.DefaultView.ToTable();
             //將狀態列轉換為二進位字元
             string s = "";
             for (int j = 0; j < dttemp.Rows.Count; j++)
             {
                 if (dttemp.Rows[j]["flag"].ToString().ToLower() == "true")
                 {
                     s += "1";//選中狀態(true,即具備該許可權)用1表示
                 }
                 else
                 {
                     s += "0";//非選中狀態(false,即不具備該許可權)用0表示
                 }
             }
             return s;//返回象徵許可權的二進位字元串
         }
複製代碼

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • linux系統中通過find命令來查找文件,該命令有眾多參數,這裡只是列舉了一些常見用法。 ...
  • Linux下運行的Web伺服器Apache,預設日誌文件是不分割的,一個整文件既不易於管理,也不易於分析統計。安裝cronolog後,可以將日誌文件按時間分割,易於管理和分析。 cronolog安裝配置非常簡單,下載後只需要輸入幾個命令即可完成。 1、下載(最新版本) 如果這個鏈接失效,請上這個鏈接 ...
  • 總結一下上一個項目中對webapi 用戶登錄許可權控制的設計 目的:前端可以根據介面的狀態碼來判斷用戶的登錄狀態,以及訪問許可權 1.首先我們在webconfig裡面添加一條配置,用於開啟或關閉許可權控制 2.先瞭解一下 ActionFilterAttribute 這個類,該類可以在action方法執行前 ...
  • 1 環境搭建:安裝CAD 和objectArx庫,這裡安裝的是cad2012和objectArx2010 ,vs是2010 2 新建一個類庫項目,引用objectArx安裝目錄下inc文件夾下的AcDbMgd.dll和AcMgd.dll,這裡註意X86和X64系統的區別 3 添加兩個類,一個繼承IE ...
  • 在現今很多網站裡面,都使用了微信開放平臺的掃碼登錄認證處理,這樣做相當於把身份認證交給較為權威的第三方進行認證,在應用網站裡面可以不需要存儲用戶的密碼了。本篇介紹如何基於微信開放平臺的掃碼進行網站的登陸處理。 ...
  • "%~dp0",在BAT中,是不是“相對路徑”的意思 (2013-08-21 12:19:32) 轉載▼ "%~dp0",在BAT中,是不是“相對路徑”的意思 轉載▼ 標簽: 雜談 分類: C# 雜談 0念 零 ,代表你的批處理本身。 d p是FOR 命令的擴展。%~f0 將 %I 擴展到一個完全合 ...
  • 目錄: 支持操作系統 IIS配置 安裝。 網路核心Windows伺服器托管包 部署應用程式 在IIS配置網站 創建一個數據保護註冊表項 常見的錯誤 額外的資源 目錄: 支持操作系統 IIS配置 安裝。 網路核心Windows伺服器托管包 部署應用程式 在IIS配置網站 創建一個數據保護註冊表項 常見 ...
  • API: http://mp.weixin.qq.com/wiki/10/0234e39a2025342c17a7d23595c6b40a.html https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_5 請求prepay_id得 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...