.NET之后臺用戶權(quán)限管理實現(xiàn)
序:在功能性比較強大的后臺管理網(wǎng)站處于各種角度考慮多有應(yīng)用權(quán)限管理功能。以公司內(nèi)部管理系統(tǒng)為例,管理員根據(jù)不同員工所在不同部門賦予其不同權(quán)限,或者根據(jù)上下級隸屬關(guān)系實現(xiàn)“金字塔”管理。本文內(nèi)容有不盡不實之處懇請指正。
正文:
如下效果圖是否令某用戶具備相應(yīng)權(quán)限用checkbox狀態(tài)區(qū)別存儲。
(一)儲存
這里的權(quán)限功能(類別)名稱和權(quán)限模塊(具體)名稱均是手動輸入數(shù)據(jù)庫,不可增刪改查。本例將某權(quán)限模塊作為最基本元素,是否具備該權(quán)限用1或0表示,進(jìn)而將當(dāng)前用戶所有權(quán)限鏈接組成二進(jìn)制字符串儲存在數(shù)據(jù)庫中。如示例代碼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">模塊數(shù)</param>
/// <param name="sb">html表格</param>
/// <param name="RoleActions">權(quán)限二進(jìn)制字符串</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(',');//用逗號間隔功能模塊數(shù)
string[] str = moduleidstr.Split(',');//移除逗號,以數(shù)組形式保存
for (int i = 0; i < str.Length; i++)//循環(huán)數(shù)組
{
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 + " ");
}
else
{
//修改
if (RoleActions.Length >= list[j].FuncNo)
{
//FuncNO代表當(dāng)前權(quán)限位于二進(jìn)制字符索引值
if (RoleActions.Substring(list[j].FuncNo - 1, 1) == "1")//截取權(quán)限二進(jìn)制字符串并判斷其狀態(tài)
{
//選中狀態(tài)
funsb.Append("<input id=\"" + list[j].FuncNo.ToString() + "\" type=\"checkbox\" checked=\"checked\" value=\"" + list[j].FuncNo.ToString() + "\" />");
funsb.Append(list[j].FuncName + " ");
}
else
{
//非選中狀態(tài)
funsb.Append("<input id=\"" + list[j].FuncNo.ToString() + "\" type=\"checkbox\" value=\"" + list[j].FuncNo.ToString() + "\" />");
funsb.Append(list[j].FuncName + " ");
}
}
else
{
funsb.Append("<input id=\"" + list[j].FuncNo.ToString() + "\" type=\"checkbox\" value=\"" + list[j].FuncNo.ToString() + "\" />");
funsb.Append(list[j].FuncName + " ");
}
}
}
}
//替換功能項
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>
/// 生成角色二進(jìn)制字符串
/// </summary>
/// <param name="str"></param>
/// <returns>二進(jìn)制序列</returns>
private string GenerateRoleAction(string str)
{
//虛擬表構(gòu)建兩列存儲權(quán)限序列號及其狀態(tài)
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('|');//截取任意兩個二進(jìn)制元素之間豎線
for (int i = 0; i < strarray.Length; i++)
{
DataRow dr = dt.NewRow();
dr[0] = strarray[i].Split(',')[0];//權(quán)限序列號
dr[1] = strarray[i].Split(',')[1];//權(quán)限狀態(tài),用true和false區(qū)別記錄
dt.Rows.Add(dr);
}
dt.DefaultView.Sort = "funno asc";
DataTable dttemp = dt.DefaultView.ToTable();
//將狀態(tài)列轉(zhuǎn)換為二進(jìn)制字符
string s = "";
for (int j = 0; j < dttemp.Rows.Count; j++)
{
if (dttemp.Rows[j]["flag"].ToString().ToLower() == "true")
{
s += "1";//選中狀態(tài)(true,即具備該權(quán)限)用1表示
}
else
{
s += "0";//非選中狀態(tài)(false,即不具備該權(quán)限)用0表示
}
}
return s;//返回象征權(quán)限的二進(jìn)制字符串
}
相關(guān)文章
asp.net實現(xiàn)導(dǎo)出DataTable數(shù)據(jù)到Word或者Excel的方法
這篇文章主要介紹了asp.net實現(xiàn)導(dǎo)出DataTable數(shù)據(jù)到Word或者Excel的方法,涉及asp.net操作office文件的相關(guān)技巧,需要的朋友可以參考下2016-08-08ASP.NET Core 3.x 并發(fā)限制的實現(xiàn)代碼
這篇文章主要介紹了ASP.NET Core 3.x 并發(fā)限制的實現(xiàn)代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11讓GridView只更新某些特定的數(shù)據(jù)的方法
我又不希望所有的數(shù)據(jù)都可以修改,只希望修改某些特定的列,用下面的方法即可2008-10-10輕量級ORM框架Dapper應(yīng)用之實現(xiàn)CURD操作
這篇文章介紹了使用Dapper實現(xiàn)CURD操作的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-03-03.NET?6開發(fā)TodoList應(yīng)用實現(xiàn)系列背景
這篇文章主要介紹了.NET?6開發(fā)TodoList應(yīng)用實現(xiàn)系列背景,NET?6是一個很優(yōu)秀的框架,這一點自從我最開始接觸.NET?Core?2起一年一年進(jìn)化到現(xiàn)在,就深切地感受到,那好東西就拿出來和大家分享一下,下面來看一下文章的學(xué)習(xí)介紹吧2021-12-12