Shenjk

天地生人,有一人应有一人之业;人生在世,生一日当尽一日之勤

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

    在进行用户、组、权限设计的时候,我们首先要考虑,我们的权限控制到什么地步:仅控制用户权限?仅控制组权限?还是用户和组的权限同时控制?

    下面是用户,组和权限三个实体:

 

    

接下来我们分析几种情况的实现:

 情况一:仅控制用户权限,这种情况相对简单,我们仅需对UserInfo增加一个属性 PopedomStr,将该用户拥有的权限拼接成字符串保存。

 情况二:仅控制组的权限,这种情况与情况一相似,不同的是不用给UserInfo增加PopedomStr 属性,只需给UserGroupInfo增加该属性,用户的权限就完全依赖于其加入的组。

 情况三:同时控制组和用户的权限,这时候不能简单的给用户和组分别增加PopedomStr属性了,我们考虑到以下情形:

          1)用户可以加入A组和B组(多个组),

          2)A组有的权限,B组不一定有;

          3)A组和B组存在的权限,对于某一用户可能被禁用

          4)A组和B组都不存在的权限,对于某一用户可能开放;

          5)将用户从某组移除,或移除某个组。

        很显然,上述情形,仅靠两个属性是无法解决了。因此我们可以考虑保留组的PopedomStr,而将用户PopedomStr剥离出来,

形成以下几个实体:

UserGroupStroeInfo用于保存用户和组的关系,PopedomPatchInfo用户保存用户除组权限以外的特殊权限或从组中排除的权限;其中PatchType标识是开放特殊权限还是排除特殊权限,PopedomId对应到具体权限的id;

因此我们要获取某个用户的权限的时候,按如下步骤进行:

    1)获取用户所在组的权限,并合并所有权限,

     2)从PopedomPatchInfo中查询出用户开放的特殊权限和排除的权限

     3)合并开放权限,并排除需要排除的权限,最终形成用户真是权限。

 

/// <summary>
        
/// 获取用户的权限串
        
/// </summary>
        
/// <param name="userId"></param>
        
/// <returns></returns>
        public static string UserPopedomList(int userId)
        {
                  
            
string pstr = string.Empty;
            IList
<UserGroupStoreInfo> uglist = usergs.GetList(userId);       //获取用户所在的组 
            if (uglist != null)
            {
                
foreach (UserGroupStoreInfo us in uglist)
                {
                    UserGroupInfo g 
= usergroup.GetInfo(us.GroupId);  //获取用户组权限
                    if (g != null)
                    {
                        pstr 
= CombinePopedom(pstr, g.PopedomStr);//合并权限
                    }
                }
            }
            
            IList
<PopedomPatchInfo> ppi = popedompatch.GetList(userId); //获取用户开放的特殊权限和排除的权限
            foreach (PopedomPatchInfo p in ppi)
            {
                
if (p.PatchType == 0 || p.PatchType == -1)
                {
                    pstr 
= ChangePopedom(pstr, p.PopedomId, false); //排除该权限
                }
                
else
                {
                    pstr 
= ChangePopedom(pstr, p.PopedomId, true);  //增加特殊权限

                }
            }
            
return pstr;
        }

 

 

上面简单实现了获取用户权限,用户变更方法也就类似了,只是细节的问题了。

posted on 2009-04-05 01:57  shenjk  阅读(0)  评论(0编辑  收藏  举报