0

我在一项找不到解决方案的任务中苦苦挣扎

我有一个 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;
}
4

1 回答 1

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 事件以更新会话。

于 2013-02-28T19:57:37.233 回答