.NET之后台用户权限管理实现
序:在功能性比较强大的后台管理网站处于各种角度考虑多有应用权限管理功能。以公司内部管理系统为例,管理员根据不同员工所在不同部门赋予其不同权限,或者根据上下级隶属关系实现“金字塔”管理。本文内容有不尽不实之处恳请指正。
正文:
如下效果图是否令某用户具备相应权限用checkbox状态区别存储。
(一)储存
这里的权限功能(类别)名称和权限模块(具体)名称均是手动输入数据库,不可增删改查。本例将某权限模块作为最基本元素,是否具备该权限用1或0表示,进而将当前用户所有权限链接组成二进制字符串储存在数据库中。如示例代码1.1
(二)读取如示例代码1.2
(三)前台代码如下
//利用js添加逗号和竖线,通过hidden传值
<scriptlanguage="javascript"type="text/javascript">
functiongetcheck(){
varinputs=document.getElementById("cbpanel");
varchks=inputs.getElementsByTagName("input");
varstr="";
for(vari=0;i<chks.length;i++){
if(chks[i].type=="checkbox"){
str+=chks[i].value+","+chks[i].checked+"|";
}
}
document.getElementById("Hidden1").value=str;
}
<script>
<body>
<divid="cbpanel"><asp:LiteralID="LiteralRole"runat="server"></asp:Literal>
<inputid="Hidden1"runat="server"type="hidden"/></div>
</body>
示例代码1.2
///<summary>
///绑定所有模块分类
///</summary>
privatevoidBindAllModule()
{
StringBuildersb=newStringBuilder();
sb.Append("<tableclass=\"AddRole\"width=\"100%\"border=\"0\"cellpadding=\"0\"cellspacing=\"0\">");
Bll_User_Modulembll=newBll_User_Module();
IList<User_Model.Model_User_Module>list=mbll.GetAllList();//得到泛型集合
stringmoduleidstr="";
for(inti=0;i<list.Count;i++)
{
sb.Append("<tr><thstyle=\"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_Rolemrbll=newBLL_User_Role();
User_Model.Model_User_Rolemrmodel=mrbll.GetModel(Convert.ToInt32(Request.QueryString["nid"]));
stringRoleActions=mrmodel.RoleAction;
BindAllFunction(moduleidstr,sb,RoleActions);
}
else
{
//新增
BindAllFunction(moduleidstr,sb,"");
}
}
///<summary>
///绑定每个模块中的各个功能选项
///</summary>
///<paramname="moduleidstr">模块数</param>
///<paramname="sb">html表格</param>
///<paramname="RoleActions">权限二进制字符串</param>
privatevoidBindAllFunction(stringmoduleidstr,StringBuildersb,stringRoleActions)
{
Bll_User_Functionbll=newBll_User_Function();
IList<User_Model.Model_User_Function>list=bll.GetAllList();//功能表泛型集合
moduleidstr=moduleidstr.TrimEnd(",");//用逗号间隔功能模块数
string[]str=moduleidstr.Split(",");//移除逗号,以数组形式保存
for(inti=0;i<str.Length;i++)//循环数组
{
StringBuilderfunsb=newStringBuilder();
for(intj=0;j<list.Count;j++)
{
if(list[j].ModuleNo==Convert.ToInt32(str[i]))
{
if(RoleActions=="")
{
//新增
funsb.Append("<inputid=\""+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代表当前权限位于二进制字符索引值
if(RoleActions.Substring(list[j].FuncNo-1,1)=="1")//截取权限二进制字符串并判断其状态
{
//选中状态
funsb.Append("<inputid=\""+list[j].FuncNo.ToString()+"\"type=\"checkbox\"checked=\"checked\"value=\""+list[j].FuncNo.ToString()+"\"/>");
funsb.Append(list[j].FuncName+" ");
}
else
{
//非选中状态
funsb.Append("<inputid=\""+list[j].FuncNo.ToString()+"\"type=\"checkbox\"value=\""+list[j].FuncNo.ToString()+"\"/>");
funsb.Append(list[j].FuncName+" ");
}
}
else
{
funsb.Append("<inputid=\""+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();
}
//保存(更新)事件
protectedvoidSubmit_Click(objectsender,EventArgse)
{
stringcbstr=Hidden1.Value;//获取前台hidden传值,如“1,true|2,true|3,false|4,true”形式
........
}
示例代码1.1
///<summary>
///生成角色二进制字符串
///</summary>
///<paramname="str"></param>
///<returns>二进制序列</returns>
privatestringGenerateRoleAction(stringstr)
{
//虚拟表构建两列存储权限序列号及其状态
DataTabledt=newDataTable();
DataColumncol1=newDataColumn("funno",typeof(int));
dt.Columns.Add(col1);
DataColumncol2=newDataColumn("flag");
dt.Columns.Add(col2);
string[]strarray=str.TrimEnd("|").Split("|");//截取任意两个二进制元素之间竖线
for(inti=0;i<strarray.Length;i++)
{
DataRowdr=dt.NewRow();
dr[0]=strarray[i].Split(",")[0];//权限序列号
dr[1]=strarray[i].Split(",")[1];//权限状态,用true和false区别记录
dt.Rows.Add(dr);
}
dt.DefaultView.Sort="funnoasc";
DataTabledttemp=dt.DefaultView.ToTable();
//将状态列转换为二进制字符
strings="";
for(intj=0;j<dttemp.Rows.Count;j++)
{
if(dttemp.Rows[j]["flag"].ToString().ToLower()=="true")
{
s+="1";//选中状态(true,即具备该权限)用1表示
}
else
{
s+="0";//非选中状态(false,即不具备该权限)用0表示
}
}
returns;//返回象征权限的二进制字符串
}
相关文章
- 【愚公系列】2023年01月 .NET CORE工具案例-RedLock.net实现分布式锁
- 【Android 逆向】Android 权限 ( ro.product.cpu.abi 属性 | ro.zygote 属性 | dhcp.eth0 属性 | net.* 属性 )
- .net让Oracle与ASP.NET实现无缝连接(oracleasp)
- .net安装 Linux 上的 ASP.NET 环境(linux安装asp)
- MySQL与VB.NET的数据库开发实践(mysqlvb.net)
- 原理揭秘.NET 运用Redis图灵缓存原理(.net缓存redis)
- Net缓存技术Redis:管理数据量大的梦想(net缓存技术redis)
- .net下的数据库连接SQLServer驱动在.NET平台下的数据库连接简明介绍(sqlserver驱动在)
- Net访问Oracle数据库的简易方法(.net访问oracle)
- 基于NET的MySQL数据库开发实践(.net中使用mysql)
- Net和MySQL互相受益的强大组合(.net 与mysql)
- NET 对MySQL 的支持有限(.net不支持mysql)
- Net平台下MySQL数据库操作实践(.net mysql操作)
- 解决ASP.NET中目录访问权限的问题
- ASP.NET连接SQL数据库的简单实例代码
- .net实现webservice简单实例分享