繁体   English   中英

在何处向MeanJS应用添加基于角色的身份验证?

[英]Where to add role based authentication to MeanJS app?

我有一个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”? 关于这种事情有什么资源吗?

谢谢您的帮助!

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

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

我认为身份验证和授权逻辑应仅限于服务器端。 如果我要面对专业人士,那至少会使他的工作更加艰巨。

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

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

如果设置isPublic:false并添加一个角色数组,则可以设置可以看到菜单项的用户:

    // 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版或查看代码并尝试自行实现。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM