五月综合缴情婷婷六月,色94色欧美sute亚洲线路二,日韩制服国产精品一区,色噜噜一区二区三区,香港三级午夜理伦三级三

您現(xiàn)在的位置: 365建站網(wǎng) > 365文章 > 角色權(quán)限模塊

角色權(quán)限模塊

文章來源:365jz.com     點(diǎn)擊數(shù):461    更新時(shí)間:2009-09-17 10:27   參與評(píng)論

上下文:一般系統(tǒng)都會(huì)有不同的用戶角色,比如系統(tǒng)管理員admin,超級(jí)用戶manager,一般用戶worker
早先直接使用session保留一個(gè)值,如session["userType"].來判斷用戶的權(quán)限。
特點(diǎn):方便,但是畢竟不同角色,屬性數(shù)量和類型是不相同的,比如一個(gè)中介管理系統(tǒng)中:
admin:
channelID;所屬中介機(jī)構(gòu)
loginID;登陸id
realName;真實(shí)姓名

manager和worker
channelID;所屬中介機(jī)構(gòu)
loginID;登陸id
realName;真實(shí)姓名
groupID;所屬團(tuán)隊(duì)
level;級(jí)別(manager,work)
level2;附加權(quán)限

可能以后還會(huì)繼續(xù)添加更多不同屬性。
潛在問題:會(huì)有空session引用問題。
如果是admin登陸。admin是沒有g(shù)roupID變量的。但是程序中出現(xiàn) session["groupID"]這個(gè)是錯(cuò)誤的。
即使session["groupid"]賦個(gè)空直,但會(huì)有很多潛在的bug。


最先反應(yīng)的解決方案
不直接使用session而用3個(gè)類worker,manager,admin的屬性來得到(session中保留一個(gè)對象,就是這3個(gè)類的實(shí)例)
類根據(jù)session["userType"]來得到角色級(jí)別。
如:if("1"==session["userType"]){worker me=new worker()}
解決了不同角色用戶自己的變量的問題。
問題是原來可以直接通過 session["loginID"]來得到用戶登陸id?,F(xiàn)在直接用類不行了,要先得到不同類,再取直
getinfo()
{
string loginid="";
if("1"==session["userType"]){worker me=new worker();loginid=me.loginid;}
else
{....}
}


那么自然我們會(huì)想到定義基類和繼承。

解決方案之一
當(dāng)然是我們熟悉的類繼承。大家都知道繼承,但是用不用是另外一回事。
父類: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;
                }
            }

 

第一個(gè)問題:不直接使用session,不會(huì)有空引用session的問題,或錯(cuò)誤session問題。
第二個(gè)問題:使用了基類,可以直接使用共有屬性。

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"]。
要知道它是哪個(gè)子類。
可以
public static bool isgroupmanage()
        {
            if (HttpContext.Current.Session["userinfo"] != null && typeof(manager) == HttpContext.Current.Session["userinfo"].GetType())
            {
                return true;
            }
            else
            {
                return false;
            }
        }

之后可以轉(zhuǎn)為子類
admin myadmin=(admin)me;


ps:

1.可以寫一個(gè)自定義繼承于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;
            }
        }
    }

里面定義一個(gè)屬性public new WebUtility.admin me;(隱藏基類的me)
再讓管理員管理的頁面繼承于adminpage這個(gè)類。那么我們就可以直接使用me這個(gè)類了。還可以在adminpage里面做很多基礎(chǔ)操作。

管理員和普通登陸用戶的通用頁面可以定義屬性 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是不同類的實(shí)例。


2.
既然提供了枚舉,還是用枚舉來替換簡單的int 的1,2,3來表示用戶級(jí)別。

 

如對本文有疑問,請?zhí)峤坏浇涣髡搲?,廣大熱心網(wǎng)友會(huì)為你解答?。?點(diǎn)擊進(jìn)入論壇

發(fā)表評(píng)論 (461人查看,0條評(píng)論)
請自覺遵守互聯(lián)網(wǎng)相關(guān)的政策法規(guī),嚴(yán)禁發(fā)布色情、暴力、反動(dòng)的言論。
昵稱:
最新評(píng)論
------分隔線----------------------------

其它欄目

· 建站教程
· 365學(xué)習(xí)

業(yè)務(wù)咨詢

· 技術(shù)支持
· 服務(wù)時(shí)間:9:00-18:00
365建站網(wǎng)二維碼

Powered by 365建站網(wǎng) RSS地圖 HTML地圖

copyright © 2013-2024 版權(quán)所有 鄂ICP備17013400號(hào)