【分布式系统框架教程】-用户登陆后如何判断是否具有某操作的权限
导读部分
现在大家比较感兴趣也许就是,当用户登陆后,假如说我要来添加用户、删除用户之类的操作,那么如何来判断当前登陆用户是否具有这种操作权限呢,前面讲了那么多,其实大部分就是为了这个。
首先我需要说明的是在我们添加权限的时候都有一个生成的id,这些id都是固定的,比如说添加权限的id是18
那么在添加权限的这个页面里我们需要用到的比对id就是18,就是说这个id我们是通过查看权限列表来看这个id是多少,然后在判断的时候就用这个id来判断,下面是添加权限的提交事件里的判断权限的代码:
[C#] 纯文本查看 复制代码 protected void btnOk_Click(object sender, EventArgs e)
{
//验证权限 18是添加权限的id
if (!AuthHepler.IsAuth(18))
{
ScriptManager.RegisterStartupScript(this, this.GetType(), "js", "alert('没有权限!')", true);
return;
}
}
我们的权限id分配就是这种方式来处理的,大家应该了解了吧。
上一篇,我们说了在应用启动时将角色和角色对应的权限关系存到了静态集合中,放在了内存中,所以每次我们判断当前登陆用户的权限时只需要在内存里取数据就可以了。
首先,我们来说下传统的做法:
1.在进行操作时首先通过当前登陆用户的id去数据库的用户角色表中取一下该用户的所有的角色
2.再通过角色ids去角色权限表将将所有角色对应的权限取出来,和当前操作的权限id进行比对,如果有,则可以操作。否则不能操作。
下面来看下分布式里面的做法:
1.在进行操作时首先通过当前登陆用户的id去服务缓存中获取该用户的所有角色,如果缓存中不存在,则从数据库中提取一次并添加到缓存中,如果缓存中存在,则直接从缓存中取得所有角色。(不同用户对应着不同的缓存名,每个缓存有一个过期时间)
2.通过提取的角色ids去内存中将所有角色对应的权限去出来,进行比对。
思路上都是一样的,但是我们这里只是减少了多次的访问数据库,而是将该用户的角色存到了服务缓存中,将角色权限关系存到了内存中,只需从数据库中提取一次,可以说一劳永逸。
下面我贴出AuthHepler类的全部代码:
[C#] 纯文本查看 复制代码 public class AuthHepler
{
/// <summary>
/// 判断是否拥有权限 根据权限id
/// </summary>
/// <param name="funcId"></param>
/// <returns></returns>
public static bool IsAuth(int funcId)
{
//获取roleds 从服务器缓存中
string roleIds = LoginUser.GetMyRoleIds();
if (!string.IsNullOrWhiteSpace(roleIds))
{
//根据roleIds获取Roles对象列表 从静态集合中
var roleslist = RoleFuncRelation.GetByRoleIds(roleIds);
//遍历roles对象列表
foreach (var roles in roleslist)
{
var func = roles.functions.Where(f => f.ID == funcId);
if (func.Count() > 0)
{
return true;
}
}
}
return false;
}
}
我们在操作判断时,只需要传进来该操作的权限id即可,根据返回的bool值来判断是否拥有该权限。
好了,那么关于分布式本次升级的所有用户角色权限的内容也讲的差不多了,可能有我说的不到的地方或者大家看了不明白的地方都可以在每个教程下面回复。
|