首页 文章

Angular-permission定义通过API检索的权限

提问于
浏览
5

亲爱的堆栈溢出,

我正在尝试使用angular-permission来实现基于权限的身份验证,但我不知道在哪里定义那些通过API从我的后端检索的权限,这需要基于令牌的访问 .

首先,让我介绍一下我的应用程序的外观 . 在我的后端,我的系统门户,我定义了允许调用不同API的权限 . 权限不会一直在变化 . 仅当我添加新功能(API)时,才会添加新权限 . 例如 . permission1:api1,api2,api3 permission2:api4,api5,api6 permission3:api7,api8,api9

在前端,客户登录前端Web门户并自行创建自定义角色,将一些权限组合在一起,例如:admin:permission1,permission2,permission3 auditor:permission 3

角度权限文档说(https://github.com/Narzerus/angular-permission/blob/development/docs/1-manging-permissions.md#multiple-permissions)我可以使用PermissionStore.defineManyPermissions来定义用户登录后从API检索的权限 . 这一切都很清楚 .

所以我有两个模块 . 一个是处理用户登录的身份验证模块 . 另一个是Permission模块,它处理权限验证 . 在Permission模块.run()阶段,我定义了这样的权限:

var getPermissions = function () {
        var deferred = $q.defer();
        system.permissions.get(
            function () {
                return deferred.resolve(system.permissions._permissions);
            },
            function (error) {
                console.log("error if can't load permissions");
                console.log(error);
            }
        );

        return deferred.promise;
    };
    var loadPermissions = function () {
        var promise = getPermissions();
        promise.then(function (permissions) {
            var arrayPermissions = formatPermissionArray(permissions);
            //var arrayPermissions=['viewSeed','viewAuthentication'];
            PermissionStore.defineManyPermissions(arrayPermissions, checkPermission);

            console.log("from permission run service");
            console.log(arrayPermissions);

        }, function (reason) {
            console.log('Failed: ' + reason);
        }, function (update) {
            console.log('Got notification: ' + update);
        });
    };

    loadPermissions();

    var formatPermissionArray = function (sourceData) {
        var formatedPermissionArray = [];
        for (var i = 0; i < sourceData.length; i++) {
            formatedPermissionArray.push(sourceData[i].permissionId);
        };
        return formatedPermissionArray;
    };

但是在应用程序的引导期间,此模块已经加载,并且arrayPermissions将为空,因为用户尚未登录 .

我尝试使用oclazyload从Authentication模块的登录控制器加载Permission模块,这实际上有效,但如果用户刷新/重新加载他们的页面,将不再加载Permission模块 .

我是webdevelpment的新手,也是angularjs的新手 . 短短几个月的经历 . 我不知道我是否以完全错误的方式做到这一点 . 我的问题是:

  • 用于查找权限列表的API应该要求身份验证吗?因为我需要将这些身份验证放在UI路由器路由上 . 无论如何,任何人都可以看到它如果我不应该保护该API,那么我的问题就解决了 .

  • 如果我应该保护我的api,我应该如何解决上面描述的问题,以及在哪里定义angular-perrmission的权限以及如何使用API来检索权限 .

我希望我能清楚地描述我的问题 . 非常感谢任何帮助或指导 .

问候,萝拉

1 回答

  • 1

    我正在使用角度卫星的角度许可 . PermRoleStorePermPermissionStore 需要在 run 块中 . 您可以向JSON WEB TOKEN添加数据,像我一样在 run 块添加使用它 .

    $auth.getPayload() 此函数从localStorage中的JWT返回有效负载 . 在该有效负载中,它具有带有角色密钥的数据,我将其保存在后端 . 我希望这有助于你的问题 .

    .run(function (PermRoleStore, $auth, Yollar) {
    PermRoleStore    
    .defineRole('ADMIN', function () {
      if($auth.getPayload()) {
    
      if ($auth.getPayload().data.role === 'ADMIN') {
        return true;
      }
      else {
        return false;
      }
    }
    else {
      return false;
    }
    });
    PermRoleStore    
    .defineRole('MODERATOR', function () {
      if($auth.getPayload()) {
    
      if ($auth.getPayload().data.role === 'MODERATOR') {
        return true;
      }
      else {
        return false;
      }
    }
    else {
      return false;
    }
    });
    })
    

相关问题