Динамический 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/