上下文:一般系統都會有不同的使用者角色,比如系統管理員admin,超級使用者manager,一般使用者worker
早先直接使用session保留一個值,如session["userType"].來判斷使用者的許可權。
特點:方便,但是畢竟不同角色,屬性數量和類型是不相同的,比如一個中介管理系統中:
admin:
channelID;所屬中介機構
loginID;登陸id
realName;真實姓名
manager和worker
channelID;所屬中介機構
loginID;登陸id
realName;真實姓名
groupID;所屬團隊
level;層級(manager,work)
level2;附加許可權
可能以後還會繼續添加更多不同屬性。
潛在問題:會有空session引用問題。
如果是admin登陸。admin是沒有groupID變數的。但是程式中出現 session["groupID"]這個是錯誤的。
即使session["groupid"]賦個空直,但會有很多潛在的bug。
最先反應的解決方案
不直接使用session而用3個類worker,manager,admin的屬性來得到(session中保留一個對象,就是這3個類的執行個體)
類根據session["userType"]來得到角色層級。
如:if("1"==session["userType"]){worker me=new worker()}
解決了不同角色使用者自己的變數的問題。
問題是原來可以直接通過 session["loginID"]來得到使用者登陸id。現在直接用類不行了,要先得到不同類,再取直
getinfo()
{
string loginid="";
if("1"==session["userType"]){worker me=new worker();loginid=me.loginid;}
else
{....}
}
那麼自然我們會想到定義基類和繼承。
解決方案之一
當然是我們熟悉的類繼承。大家都知道繼承,但是用不用是另外一回事。
父類:baseuser
子類:worker,admin,manager
public class baseUser
{
public readonly int channelID;
public readonly string loginID;
public readonly string realName;
public readonly webenum.userType level;
public baseUser(int channelid, string loginid, string realname, webenum.userType levela)
{
channelID = channelid;
loginID = loginid;
realName = realname;
level = levela;
}
}
public class worker:baseUser
{
public readonly string level2;
public readonly int groupID;
public worker(int channelid, string loginid, string realname, string level2a, int groupid):base(channelid,loginid,realname,webenum.userType.worker)
{
level2 = level2a;
groupID = groupid;
}
}
public class manager : baseUser
{
public readonly string level2;
public readonly int groupID;
public manager(int channelid, string loginid, string realname,string level2a, int groupid)
: base(channelid, loginid, realname, webenum.userType.groupmanage)
{
level2 = level2a;
groupID = groupid;
}
}
public class admin : baseUser
{
public admin(int channelid, string loginid, string realname)
: base(channelid, loginid, realname, webenum.userType.admin)
{ }
}
看下我們怎麼初始化
if ("0" == type)
{
zjpx.BLL.zj_worker bllworker = new zjpx.BLL.zj_worker();
zjpx.Model.zj_worker me= bllworker.loginCheck(loginname, psw);
if (me!=null)
{
if (me.w_level == (int)WebUtility.webenum.userType.groupmanage)
{
WebUtility.baseUser userInfo = new channelpx.WebUtility.manager(me.w_zj, me.w_name, me.w_rname,me.w_level2, me.w_tuandui);
Session["userinfo"] = userInfo;
}
else if(me.w_level==(int)WebUtility.webenum.userType.worker)
{
WebUtility.baseUser userInfo = new channelpx.WebUtility.worker(me.w_zj, me.w_name, me.w_rname, me.w_level2, me.w_tuandui);
Session["userinfo"] = userInfo;
}
}
}
//管理員
else
{
//zjpx.Model.zj_worker me = bllworker.loginCheck(loginname, psw);
if (true)
{
WebUtility.baseUser userInfo = new channelpx.WebUtility.admin(6, loginname,"");
Session["userinfo"] = userInfo;
}
}
第一個問題:不直接使用session,不會有Null 參考session的問題,或錯誤session問題。
第二個問題:使用了基類,可以直接使用共有屬性。
Model.zj_worker me= bllworker.loginCheck(loginname, psw);
baseUser userInfo = new worker(me.w_zj, me.w_name, me.w_rname,me.w_level, me.w_level2, me.w_tuandui,WebUtility.webenum.userType.groupmanage);
Session["userinfo"] = userInfo;
直接使用session["userinfo"]。
要知道它是哪個子類。
可以
public static bool isgroupmanage()
{
if (HttpContext.Current.Session["userinfo"] != null && typeof(manager) == HttpContext.Current.Session["userinfo"].GetType())
{
return true;
}
else
{
return false;
}
}
之後可以轉為子類
admin myadmin=(admin)me;
ps:
1.可以寫一個自訂繼承於page的類,比如 adminpage:page
public class adminpage:basepage
{
public new WebUtility.admin me;
protected override void OnPreInit(EventArgs e)
{
base.OnPreInit(e);
if (!WebUtility.userHelper.isadmin())
{
HttpContext.Current.Response.Redirect("/nolevel.aspx");
}
else
{
me = (WebUtility.admin)base.me;
}
}
}
裡面定義一個屬性public new WebUtility.admin me;(隱藏基類的me)
再讓管理員管理的頁面繼承於adminpage這個類。那麼我們就可以直接使用me這個類了。還可以在adminpage裡面做很多基礎操作。
管理員和普通登陸使用者的通用頁面可以定義屬性 baseuser(基類)
public class basepage:Page
{
public WebUtility.baseUser me;
protected override void OnPreInit(EventArgs e)
{
if (!WebUtility.userHelper.checkLogin())
{
Response.Redirect("/login.aspx", true);
}
else
{
me = (WebUtility.baseUser)Session["userinfo"];
}
base.OnPreInit(e);
}
}
繼承不同的類。我們得到的me是不同類的執行個體。
2.
既然提供了枚舉,還是用枚舉來替換簡單的int 的1,2,3來表示使用者層級。 免責聲明:部分內容來自網路,如有侵犯,請聯絡我們刪除或修改,另:本文僅代表作者觀點,與烈火網無關。其原創性以及文中陳述文字和內容未經本站證實,對本文以及其中全部或者部分內容、文字的真實性、完整性、及時性本站不作任何保證或承諾,僅作參考,並請自行核實相關內容。