我在一项无法找到解决方案的任务中苦苦挣扎
我有一个asp net mvc 4应用程序,我已经实现了一个权限系统。 此应用程序有一个静态对象,在用户登录时填充权限信息。
一旦登录
,就会为每个用户创建一个新对象每次用户调用操作时都会检查此对象。
但是在管理员更改某些权限规则的情况下,我需要找到一种方法将此更改传播给所有已记录的用户。 此时用户需要注销并再次登录以使更改生效。
我能够获得所有当前登录的用户。但是如何获得与每个用户关联的静态对象?代码有点大,但它正在工作......我只需找到一种方法来为每个登录用户获取它
这是对象:
模型:
public static class permissionTemp
{
public static Guid userGuid { get; set; }
public static string[] grupos { get; set; }
public static string[] permissoes { get; set; }
}
控制器:
public bool createPermissionObject(Guid userID, string username)
{
using (gedaiappEntities context = new gedaiappEntities())
{
//Cria objeto global de permissões
gedaiapp.Models.permissionTemp.userGuid = userID;
//Resgata todos os grupos do usuário
gedaiapp.Models.permissionTemp.grupos = Roles.GetRolesForUser(username);
List<string> c = new List<string>();
//Primeiro carrega permissões dos Grupos atribuidos ao usuário
foreach (var grupo in gedaiapp.Models.permissionTemp.grupos)
{
//Recupera id do grupo
var grpId = (from a in context.aspnet_Roles
where a.RoleName == grupo
select a.RoleId).First();
//Resgata todas as permissões do grupo
var permGrpIdsObj = from a in context.sistema_permissoes_grupos
where a.groupId == grpId
select a.idPermissao;
if (permGrpIdsObj.Any())
{
var permGrpIdsLst = permGrpIdsObj.ToList();
foreach (var permGrpId in permGrpIdsLst)
{
var permName = (from a in context.aspnet_Roles
where a.RoleId == permGrpId
select a.RoleName).First();
c.Add(permName);
}
}
}
//Por último carrega as permissões individuais do usuário
var permUsrIdsObj = from a in context.sistema_permissoes_usuarios
where a.userGuid == userID
select a.idPermissao;
if (permUsrIdsObj.Any())
{
var permUsrIds = permUsrIdsObj.ToList();
foreach (var permUsrId in permUsrIds)
{
var perm = (from a in context.aspnet_Roles
where a.RoleId == permUsrId
select a.RoleName).First();
c.Add(perm);
}
}
//Atribui todas as permissões encontradas (GRUPO e INDIVIDUAIS) para o modelo
gedaiapp.Models.permissionTemp.permissoes = c.ToArray();
}
return true;
}
答案 0 :(得分:0)
将静态更改为普通类。
public class permissionTemp
{
public Guid userGuid { get; set; }
public string[] grupos { get; set; }
public string[] permissoes { get; set; }
}
创建对象并填充它。另外,请考虑将返回类型更改为permissionTemp而不是bool。而且我不知道你打算返回bool结果,因为你已经在开头填充了userID并且总是返回true。
public **permissionTemp** createPermissionObject(Guid userID, string username)
{
var objPermission = new permissionTemp();
using (gedaiappEntities context = new gedaiappEntities())
{
//Cria objeto global de permissões
objPermission.userGuid = userID;
//
objPermission.grupos = Roles.GetRolesForUser(username);
....
objPermission.permissoes = c.ToArray();
}
return objPermission;
}
修改强>
当用户登录应用程序并在应用程序的其余部分中使用它时,它可以存储在会话或配置文件中。但同时,如果管理员更改权限,则会在下次登录时应用于用户。
修改强>
我理解您要使用静态列表实现的目标。考虑到这种情况,静态列表中填充了所有用户权限,管理员更改了权限,静态列表不会更新,直到新用户登录。由于静态列表不打算从数据库更新数据,因此它仍保留在本地缓存中。
尝试在权限表上使用SQLCacheDependecy,并处理它的onchange事件以更新会话。