在ASP.NET MVC中,我在Session中保存了具有其权限的用户对象,因此我不必每次都去数据库。所以我使用Session作为缓存。例如:
用户登录时:
User user = dbContext.Users.Include(u => u.Privileges).SingleOrDefault(u => u.UserId == userId)
Session["CurrentUser"] = user;
当用户执行将来的请求时:
public ActionResult CreateSomething()
{
User user = Session["CurrentUser"];
if (user == null)
{
// Error: not logged in
}
if (!user.Privileges.Any(p => p.PrivilegeId == PrivilegesEnum.CreateSomething))
{
// Error: doesn't have privilege
}
...
}
正如您所看到的,“.Any(...)
”将在内存中运行,这比访问数据库更快。
问题是其他用户可以撤销或添加已记录用户的权限,这些已登录的用户只有在下次登录时才会感知到这些更改。
public ActionResult RevokePrivilege(long targetUserId, long privilegeId)
{
...
targetUser.Privileges.Remove(privilege)
dbContext.SaveChanges();
// ... (*)
}
问题是:我可以访问(*)中的其他会话,以便我也可以在内存中进行这些更改吗?
像(我在这里发明)
foreach (var kvp in SessionDictionary.Where(kvp => kvp.Value.UserId == user.UserId).ToList())
{
SessionDictionary[kvp.Key]["CurrentUser"].Privileges.Remove(privilege);
}
答案 0 :(得分:0)
可能您可以访问其他会话,但这不太容易。
在会话中添加时间戳并让它重新加载数据库内容是很容易的 到期。如果会话数据超过15秒或者您设置的任何内容,这将允许您从数据库刷新会话数据。