在进行用户、组、权限设计的时候,我们首先要考虑,我们的权限控制到什么地步:仅控制用户权限?仅控制组权限?还是用户和组的权限同时控制?
下面是用户,组和权限三个实体:
接下来我们分析几种情况的实现:
情况一:仅控制用户权限,这种情况相对简单,我们仅需对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>
/// <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;
}
上面简单实现了获取用户权限,用户变更方法也就类似了,只是细节的问题了。