【问题标题】:Where to add role based authentication to MeanJS app?在哪里将基于角色的身份验证添加到 MeanJS 应用程序?
【发布时间】:2015-06-28 14:42:36
【问题描述】:

我有一个 meanjs 入门模板(带有 yeoman 生成器)。 在哪里可以向我的模块添加特定权限?例如,

'use strict';

// Configuring the Articles module
angular.module('adminpanel').run(['Menus',
    function(Menus) {
        // Set top bar menu items
        //Menus.addMenuItem('topbar', 'admin panel', 'adminpanel/', 'adminpanel');

        Menus.addMenuItem('topbar', 'Admin Panel', 'adminpanel', 'dropdown', '/buildings(/create)?');
        Menus.addSubMenuItem('topbar', 'adminpanel', 'List Collections', 'adminpanel/collections');
    }
]);

和这样的路线 '使用严格';

//Setting up route
angular.module('adminpanel').config(['$stateProvider',
    function($stateProvider) {
        // Adminpanels state routing
        $stateProvider.
        state('listCollections', {
            url: '/adminpanel/collections',
            templateUrl: 'modules/adminpanels/views/list-collections.client.view.html'
        }).
        state('showCollection', {
            url: '/adminpanel/collections/:collectionName',
            templateUrl: 'modules/adminpanels/views/show-collection.client.view.html'
        }).
        state('showCollectionItem', {
            url: '/adminpanel/collections/:collectionName/:itemId',
            templateUrl: 'modules/adminpanels/views/show-item.client.view.html'
        });
    }
]);

这些是添加基于角色的身份验证(在客户端)并在服务器端添加措施的正确位置吗(我已经这样做了)?

有人知道我如何在不破坏菜单的情况下向菜单添加选项(某些功能),例如“admin.hasPermission”吗?有关于这类事情的资源吗?

感谢您的帮助!

【问题讨论】:

    标签: javascript angularjs roles meanjs


    【解决方案1】:

    我认为将您的身份验证、授权代码放在客户端和服务器端是不正确的做法。它们应该只在服务器端。

    关键是,你必须在客户端复制你的身份验证和授权代码,任何人都可以阅读你的机制来处理这些情况,一旦发现漏洞,你的服务器代码也会跟着它。

    我认为身份验证和授权逻辑应该仅限于服务器端。如果我与专业人士对战,至少会让他的任务更加艰巨。

    如果您坚持,您可以围绕$http 服务创建一个包装器,维护一个角色可以做什么的键值对,并确保所有 AJAX 请求都通过您的包装器服务,您可以检查它是否应该被允许.如果是,您可以简单地使用$http 转发请求,如果不是,则抛出错误。

    【讨论】:

    • 对不起,我应该详细说明客户端的“安全性”。对于客户端,我所说的“安全性”根本就是不呈现某些模块——例如,在我的顶部栏中,除非用户被认证为管理员,否则不应呈现“管理面板”菜单项。
    【解决方案2】:

    不确定任何以前的版本,但是对于 0.4.0 版本,客户端配置中有参数来控制可见性:

    如果你设置 isPublic: false 并添加一个 roles 数组你可以设置用户可以看到菜单项:

        // Add the dropdown listCollentcions item
        Menus.addSubMenuItem('topbar', 'adminpanel', {
            title: 'listCollections',
            isPublic: false,
            roles:['admin'],
            state: 'adminpanel.listCollections'
        });
    

    实现在核心模块(menu.client.services.js)中:

    // A private function for rendering decision 
        var shouldRender = function(user) {
            if (user) {
                if (!!~this.roles.indexOf('*')) {
                    return true;
                } else {
                    for (var userRoleIndex in user.roles) {
                        for (var roleIndex in this.roles) {
                            if (this.roles[roleIndex] === user.roles[userRoleIndex]) {
                                return true;
                            }
                        }
                    }
                }
            } else {
                return this.isPublic;
            }
    
            return false;
        };
    

    也许您可以尝试 0.4.0 版或查看代码并尝试自己实现。

    【讨论】:

      猜你喜欢
      • 2020-03-04
      • 2019-09-11
      • 2016-01-03
      • 2021-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-04
      相关资源
      最近更新 更多