Динамический HTML-контент в зависимости от роли пользователя

Я занимаюсь разработкой одностраничного веб-приложения. Я хочу создать меню на основе роли пользователя, например, для пользователей с правами администратора, я хочу показать меню администратора и html-контент, для обычных пользователей я хочу показать другой html-контент. Я использую asp.net mvc с движком Razor, поэтому это можно сделать с помощью кода Razor следующим образом:

@if (@User.IsInRole("Admin"){
  -- html content for admin --
}else if (@User.IsInRole("General"){
  -- html content for general user --
}else{
  -- html content for the other users --
}

В прошлом это был типичный способ разработки веб-приложения традиционным способом, однако с тех пор, как я начал разрабатывать веб-приложение в стиле одностраничного приложения, я пытался писать чистый HTML-код и избегал использования движка представления на стороне сервера, такого как Razor, WebForm в asp.net или Velocity, библиотека тегов Jsp в Java EE. Я хочу написать более независимый код переднего плана без зависимости кода сервера.

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

<!-- ko if: isAdmin -->
-- html content for admin --
<!-- /ko -->
<!-- ko if: isGeneralUser -->
-- html content for general user --
<!-- /ko -->
<!-- ko if: isOtherUser -->
-- html content for the other users --
<!-- /ko -->

isAdmin, isGeneralUser и isOtherUser являются свойствами viewmodel, и эти значения будут установлены посредством вызова ajax, который проверяет роль пользователя.

Что мне интересно, так это то, подходит ли такой способ управления контентом для роли пользователя с точки зрения безопасности?

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

1 ответ

Я бы использовал привязку шаблона

<div data-bind="template: { name: template, data: model }"></div>

В viewmodel установите правильный шаблон и модель в зависимости от роли пользователя, также вам все равно нужно защитить специфичные для роли методы на стороне сервера

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

Привязка шаблона выше с моей структурой будет выглядеть так

<div data-bind="coc: model"></div>

Если ViewModel называется AdminViewModel, моя библиотека будет искать шаблон с именем AdminView

Маленькая скрипка http://jsfiddle.net/2Uvd5/1/

редактировать: для более точного примера того, что вы хотите сделать http://jsfiddle.net/XaZxj/

Другие вопросы по тегам