Где добавить аутентификацию на основе ролей в приложение MeanJS?

У меня есть стартовый шаблон meanjs (с генератором yoman). Где я могу добавить определенные разрешения для своих модулей? Например,

'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');
    }
]);

и такие маршруты, как "use strict";

//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», не нарушая его? Любые ресурсы по такого рода вещам?

Спасибо за помощь!


person h3xc0ntr0l    schedule 21.04.2015    source источник


Ответы (2)


Я не считаю правильным помещать вашу аутентификацию, код авторизации на стороне клиента, а также на стороне сервера. Они должны быть только на стороне сервера.

Дело в том, что вы должны реплицировать свой код аутентификации и авторизации в клиенте, любой может прочитать ваш механизм, чтобы справиться с этой ситуацией, и как только лазейка будет обнаружена, за ней просто последует код вашего сервера.

Я считаю, что логика аутентификации и авторизации должна быть ограничена только серверной частью. Если я выступаю против кого-то профессионала, это, по крайней мере, усложнит его задачу.

Если вы настаиваете, вы можете создать оболочку вокруг службы $http, сохранить пару ключ-значение, какая роль может что делать, и убедиться, что все запросы AJAX проходят через вашу службу-оболочку, где вы можете проверить, следует ли это разрешить. Если да, вы можете просто переслать запрос с помощью $http, а если нет, выдать ошибку.

person Paras    schedule 21.04.2015
comment
Извините, я должен был уточнить безопасность на стороне клиента. Для клиента безопасность, о которой я говорю, просто не отображает определенные модули — например, в моей верхней панели пункт меню панели администратора не должен отображаться, если пользователь не аутентифицирован как администратор. - person h3xc0ntr0l; 21.04.2015

Не уверен насчет какой-либо предыдущей версии, но с версией 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 или взглянуть на код и попытаться реализовать его самостоятельно.

person Prince V    schedule 27.04.2015