日期:2014-05-20  浏览次数:20808 次

關於Winform中字段級權限的思路,歡迎批評指正!
我現在是這樣做的:一個權限表,保存窗體、按鈕、字段的權限,結構是
用戶、功能項(窗體、按鈕、字段的名字)、權限類型(int類型,窗體和按鈕隻有兩種權限類型:允許、拒絕。
字段有三種權限類型:隻讀、無權、可寫)
  界面的代碼如下:“新增”按鈕的權限
C# code

         //用戶在某個窗體的權限列表。key為功能項名,如按鈕名稱。value為權限類型
          Hashtable hash = ttaad431mgr.GetHashtableByID(str_usid, this.Name);
           
          bool auth_AddNew = false;

            if (hash.Contains("btnAddNew"))
            {
                int int_AddNew = (int)hash["btnAddNew"];

                if (int_AddNew == (int)Common.PermisionFuntEnum.Permit)
                {
                    auth_AddNew = true;
                }
            }
            //IsEdit 是否編輯狀態
            btnAddNew.Enabled = IsEdit ? false : auth_AddNew;


下面是字段的權限:
C# code

           int auth_nama = (int)Common.PermisionFildEnum.Reject;

            if (hash.Contains("nama"))
            {
                auth_nama = (int)hash["nama"];
            }

            labnama.Tag = auth_nama;//標簽保存權限類型,“復制”中使用           

            if (auth_nama == (int)Common.PermisionFildEnum.ReadOnly)
            {
                txtnama.PasswordChar = Convert.ToChar(0);

                txtnama.Enabled = true;

                txtnama.ReadOnly = true;
            }
            else if (auth_nama == (int)Common.PermisionFildEnum.Reject)
            {
                txtnama.PasswordChar = ' ';
                txtnama.Enabled = false;
            }
            else
            {
                txtnama.PasswordChar = Convert.ToChar(0);

                txtnama.Enabled = true;

                txtnama.ReadOnly = !IsEdit;
            }



------解决方案--------------------
这个权限控制很好.但是还是存在一些问题,最大的问题就是不灵活,楼主应该能体会到.
1.可以把一些功能宏观化,这样就可以找出规律.例如增 删 改 查,这些都是可以归结到页面级,是否具有对A页面的浏览权限,如果有,那么是否有对数据的增 删 改 查等权限.等等.
2.当然,对于个别特殊功能,是无法抽象出规律的,这个时候就要细化,而不论怎么细化都离不开增 删 改 查这些基本概念.具体功能具体做,这样的特出权限控制的地方应该不多.
3.关于表的设计.这点可以说是最重要的.但是以目前楼主的设计来看,可扩展性几乎没有.主要的原因就是多用户问题,既然有权限控制,那么肯定是牵扯到多用户的.不同的用户对某个功能具有不同的权限,相同级别的用户对某个相同的功能也可能具有不同的权限,这些控制都是相当复杂的.而主要只能归结到表的设计问题上.
这里可以设计表的关联,以数字映射编码的方式减少查询次数以及表的记录数.例如,可以添加一个权限字段,用来保存权限每个页面的权限编码,每个页面作为一条记录.
1,1111 2,0001 例如这个编码,我们可以翻译成,级别为1的用户具有对这个页面的增 删 改 查权限.级别为2的用户具有对这个页面的查看权限.
不多废话了,这个权限的问题,有些复杂,我只能说说自己的观点,具体设计还是要看楼楼主的.主要就是可扩展性.
------解决方案--------------------
早5年前,我就这样用了。用下来感觉还不错,一般的最多的需要后期自定义的权限控制是字段,其他的按钮什么的可以再代码中写死。你可以这样设计权限:

菜单项-->模块

菜单项里面就定义对该模块(对应表的录入界面)的字段的权限(可看、可改、不可见)