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; }
}

オブジェクトを作成して移入します。また、戻り値の型を bool ではなく、permissionTemp に変更することを検討してください。また、最初にユーザーIDを入力し、常にtrueを返すため、bool結果を返す意図がわかりません。

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 に答える