2013-02-28 2 views
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; 
} 
+6

Зачем использовать статический класс для хранения данных пользовательского экземпляра? Это будет масштабироваться точно для одного пользователя. –

+1

Почему бы не изменить статический класс на открытый класс и создать «Список <разрешениеTemp>" – MethodMan

+0

. Если вы не знаете, ваш статический класс 'permissionTemp' распространяется среди всех зарегистрированных пользователей, он не создает новый для каждого пользователя. – Khan

ответ

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 для обновления сеанса.

+0

Спасибо за ваш ответ. Мне уже удалось это работать. Я ищу способ внесения изменений во время выполнения. Я не хочу ждать следующего входа, чтобы получить новые разрешения. Я спрашиваю что-то абсурдное или есть способ, даже если это сложно? Я думал, что могу создать статический список разрешений, а затем обновлять этот список каждый раз при изменении прав доступа. Когда пользователь выходит из системы, он просто уничтожает элемент из этого списка. Что ты думаешь? –

Смежные вопросы