Показывать / скрывать меню в зависимости от perfil/role пользователя

Хорошие, моя консультация главным образом состоит в том, чтобы ориентировать меня в как решать мою проблему самого оптимального способа,

У меня есть Веб с backend в nodejs, где я посылаю статические файлы (я не использую шаблоны jade), я делаю все изменения с javascript и вызовы ajax, мое сомнение - это как собирание меню (navbar) в зависимости от разрешений пользователя. adminitrador, нормальный пользователь...

back я считаю это смонтированным и в зависимости от role я могу посылать html или другой, но мне кажется чрезмерным быть должное удваивать тысячи страниц, чтобы менять только memu, где появился какой-то выбор больше.

Другой выбор состоит в том, чтобы менять это на front с js, но мне кажется более уязвимым.

Кто-то ориентирует меня немного?

Спасибо

1
задан 01.10.2016, 12:44
2 ответа

Я в PHP это делаю что-либо подобное:

В navbar добавил условный, что, если у него есть такое разрешение, появилась такая вещь, например, я - администратор и имею общее панель управления в navbar.

if($_SESSION['rol'] == 'admin') {
  <li>Panel de control</li>
}

Это это, что ты ищешь?

Привет!

1
ответ дан 24.11.2019, 13:14
  • 1
    Podr и # 237; когда мне удается стоить, но я не использую PHP одинокий javascript, jquery, как я соглашаюсь на переменные session? –  Rulogarcillan 01.10.2016, 15:51

Предостережение: Код, представленный здесь не был протестирован. Вероятно, что находятся ошибки кода или typo, что нужно упорядочивать.


Я не использую шаблоны

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


Имея в виду следующую диаграмму ER (Уже я знаю, что это NoSQL, но одинокий для иллюстрации):

Мы можем приходить к заключению о том, что:

  • Один Permiso это доступ, вышедший одному Rol на определенный SubMenu.
  • Один Rol это набор Permisos предопределенные, давая ему имя. Например, Rol Administrador смоги иметь разрешения для:
    • Читать
    • Удалять
    • Редактировать
    • Banear ;)

Этими данными мы могли бы вооружать схему в Mongo.

Создание моделей

Role

const RoleSchema = mongoose.Schema(
{
    name: {
        type: String,
        required: true
    },
    permissions: [{
        type: String,
        ref: 'Permission'
    }]
});

Permission

const PermissionSchema = mongoose.Schema(
{
    name: {
        type: String,
        required: true
    },
    description: {
        type: String,
        required: true
    }
});

MenuItem

const MenuItemSchema = mongoose.Schema(
{
    label: {
        type: String,
        required: true
    },
    url: {
        type: String,
        required: true
    },
    permissions: [{
        type: String,
        ref: 'Permission',
        required: true
    }]
});

Меню

const MenuSchema = mongoose.Schema(
{
    label: {
        type: String,
        required: true
    },
    url: {
        type: String,
        required: false,
        default: '#'
    },
    roles: [{
        type: String,
        ref: 'Role'
    }],
    items: [{
        type: String,
        ref: 'MenuItem'
    }]
});

Как только у тебя есть вся схема, они остаются делать 2 вещи:

  1. Когда пользователь будет инициализировать сеанс, приносить меню согласно Вашему списку.
  2. Нужно обрабатывать это меню в view engine в команде строить меню.

Создавая меню с Handlebars

Первое, что мы должны делать, состоит в том, чтобы получать menúes и статьи согласно списку и разрешениям пользователя (я понимаю, что ты умеешь консультироваться в Mongo). Потом, давайте верить в полное меню в handlebars.

menu.hbs

<ul class="menu">
    {{#each menus as menu}}
        {{#ifRoleAllowed menu.roles id ../user.roles}}
            <li>
                <a href="{{menu.url}}">
                    {{menu.label}}
                </a>
                <ul>
                    {{#each menu.items as item}}
                        {{#ifPermInRole item.permissions id ../user.roles}}
                            <li>
                                <a href="{{item.url}}">
                                    {{item.label}}
                                </a>
                            </li>
                        {{/ifPermInRole}}
                    {{/each}}
                </ul>
            </li>
        {{/ifRoleAllowed}}
    {{/each}}
</ul>

helper ifRoleAllowed и ifPermInRole они не принадлежат в Handlebars. Handlebars позволяет тебе увеличивать это посредством helpers настроенные. Так, мы можем создавать helper, который говорил бы нам, ли позволен пользователь для действия этого меню и(или) статьи:

ifRoleAllowed

Handlebars.registerHelper('ifRoleAllowed', function(mroles, uroles, options) {
  let isAllowed = false;
  mroles.forEach(mrole => {
    if(!isAllowed) {
        uroles.forEach(urole => {
            // son roles iguales
          if(urole === mrole) {
            isAllowed = true;   
          }
        });
    }
  });

  if(isAllowed) {
    return options.fn(this);
  }
  return options.inverse(this);
});

ifPermInRole

Handlebars.registerHelper('ifPermInRole', function(perms, roles, options) {
  let isAllowed = false;
  perms.forEach(perm => {
    if(!isAllowed) {
        roles.forEach(role => {
          if(role.contains(perm)) {
            isAllowed = true;
          }
        });
    }
  });

  if(isAllowed) {
    return options.fn(this);
  }
  return options.inverse(this);
});
1
ответ дан 24.11.2019, 13:14
  • 1
    он был противящимся шаблонам, так как только hab и # 237; в видный jade, в конце концов я начал использовать EJS и matavilla. –  Rulogarcillan 02.10.2016, 15:09
  • 2
    Yep, EJS tambi и # 233; n он хороший, хотя я предпочитаю Handlebars из-за Вашей гибкости. Aseg и # 250; rate использовать этот EJS , потому что у старого уже нет опоры. –  gugadev 02.10.2016, 15:25