Генерация JavaScript в зависимости от прав пользователя
Доброго времени суток.
Возникла следующая задача. Допустим сервис обладает несколькими группами пользователей, обладающими различными уровнями привилегий, и при работе с одним и тем же интерфейсом, каждая из групп обладает своими дополнительными возможностями. Это могут быть как дополнительные вкладки, возможность редактирования полей формы, и просто видимость каких то дополнительных элементов интерфейса. Первое что приходит в голову - это отправлять каждой из групп свой javascript код, сгенерированный на сервере, в зависимости от прав. Проблема здесь в том, что количество групп достаточно велико, чтобы для каждой из них хранить и поддерживать отдельную ветку кода. Хотелось бы иметь возможность размечать js код, и на основе разметки генерировать специфичный для группы javascript. Например: var html = "<div> Simple Div </div>"; // --priveleged { html += "<div> Priveleged Div </div>"; // --} Ext.DomQuery.select("div#target")[0].innerHTML = html; в коде введён специальный формат комментариев, начинающихся с --. На осове такой разметки на сервере может быть осуществлена компоновка кода в результате чего каждая из групп получит свой вариант функциональности Возможно уже есть какие-то решения в этой области, хотелось бы услышать ваше мнение. Спасибо |
|
Да, это очень похоже на то что нужно. К сожалению у нас используется java, поэтому продолжаю искать дальше ))
|
а как насчет передавать браузеру только информацию (не код), на основе которой сценарий будет разрешать/запрещать действия? А ненужные блоки просто не будут отображаться java'ой
|
Цитата:
|
Да, такой подход я тоже обдумывал, но мне принципиально не хочеться грузить браузер пользователя теми скриптами, которые ему в принципе не должны быть доступны...как с точки зрения размера данных, так и с точки зрения безопасности(это спорно конечно, но всё-таки).
|
Цитата:
|
В-общем я примерно придумал подход. Возможно кто-то укажет на его недостатки. Если кто-то знаком с технологией jsp в java, то он ему покажеться схожим. Заключается он в том, чтобы в специальных коментариях писать java код, потом обрабатывать файл специальным препроцессором, который код js преобразует в java файл. Сейчас будет немного понятней. Скажем у нас есть следующий js код:
var html = "<div>Simple div</div> // -- User u = request.getSession().getParameter("user"); // -- Boolean b = PermissionController.checkRights(u); // -- if(b) { html += "<div>Private div</div> // -- } Ext.DomQuery.select("div#target")[0].innerHTML = html; Такой код на сервере преобразуется в следующий java файл: response.write("var html = \"<div>Simple div</div>\""); User u = request.getSession().getParameter("user"); Boolean b = PermissionController.checkRights(u); if(b) { response.write("html += \"<div>Private div</div>\""); } response.write("Ext.DomQuery.select(\"div#target\")[0].innerHTML = html"); ... |
Цитата:
|
iDeadRat,
Не терпится вам все-таки велосипед изобрести. Хотя это дело полезное. |
не знаю, я бы написал
var html = "<div>Simple div</div>"; if(b) { html += "<div>Private div</div> } Ext.DomQuery.select("div#target")[0].innerHTML = html; а переменную b где-нибудь в страничку вставил (а скорее даже создал объект с какой-то информацией): User u = request.getSession().getParameter("user"); Boolean b = PermissionController.checkRights(u); response.write("<script>var b = \"<div>Simple div</div>\"</script>") по поводу безопасности - не знаю, может и повод, хотя сомнительный, имхо по поводу размера данных - зато эти скрипты закешируются, в противном случае они каждый раз будут генерироваться p.s. а вообще это похоже на преждевременную оптимизацию |
Не очень понял насчёт оптимизации.
По поводу кеширования вы правы, но кешировать я собираюсь на сервере, поэтому будет генерироваться не больше раза. |
Цитата:
Если .js и .css файлы статические, то они кешируются у клиента. Сайт работает заметно быстрей. |
Цитата:
|
Цитата:
<script type="text/javascript" src="base.ashx?admin=1&controlPanel=1"></script> И src всегда одинаков. В этом случае клиент действительно закеширует скрипт, и когда права поменяются скрипт будет подгружаться старый. Чтобы этого не происходило нужно добавлять random в src. Как для каптчи например: <div style="cursor: pointer;" onclick="$(this).previous().src = 'CaptchaImage.ashx?r=' + rand(9999);"> другой<br /> рисунок</div> Т. е. теперь скрипт !всегда! будет грузиться заново. А это совсем плохо. Что бы избавиться от random-а, и в тоже время подгружаемый скрипт поменялся при изменении прав, нужно генерировать src на основе данных из сессии пользователя. Т. е. возвращаемся к тому, что было предложено в постах 4 и 5. iDeadRat как раз от этого и хочет уйти. Я же думаю, что без серьезных минусов не получится. |
Если нужен кодоген, то самым простым способом будет представить яваскриптовое AST в Java (или что вы там используете?), которое затем и обрабатывать. Мы так делаем в XHB, только там генерится Хаскель.
Но то, что вы показываете в первом посте, можно замутить с помощью препроцессора Си :) или там m4 какого-нибудь. ЗЫ кодоген это хрупко, имхо |
Есть еще вариант: DSEC, смотрим ParenScript и ему подобное. :)
|
Riim, насчёт кеширования старой версии на клиенте я не подумал.
Правда явление смены прав, не так уж часто. Эту проблему я думаю мы будем решать путём введения версионности на клиенте(копать в сторону persist.js и похожих решений), либо грамотным выбором expires значений |
Артем Шалхаков, так и не нашёл про DSEC пока ничего...может расшифруете
|
Цитата:
Цитата:
p.s. повторюсь, имхо, лучше переписать скрипты, чтобы они работали со всеми группами пользователей на основе информации специфической для текущего пользователя. При этом не обязательно подгружать все скрипты/отображать все части страницы - можно только нужные Цитата:
|
2 iDeadRat
> так и не нашёл про DSEC пока ничего...может расшифруете Domain-specific embedded compiler. То есть миниатюрный компилятор, встроенный в основной язык программирования. На входе -- AST, на выходе -- например, код в текстовом виде. Плохо, что в той же Java это будет довольно сложно. Зато в OCaml/Haskell пишется на ура, пример: http://hpaste.org/fastcgi/hpaste.fcg...?id=4006#a4006 В примере конструируется AST, которое затем можно обрабатывать как угодно (это не показано). Вполне можно выделить небольшое подмножество JS, которое интересует. Вот еще примеры: - Common Lisp (http://web.telia.com/~u43518104/articles/lispweb.htm) - ParenScript (http://blogs.bl0rg.net/netzstaub/200...4/parenscript/) (Идея хорошо расширяется до внедрения HTML и CSS в Lisp :)) 2 x-yuri Ну просто ощущение такое. Когда много boilerplate (тем более сгенерированного), то это настроживает. :) Плюс размытая семантика JS, поверх такой же нечеткой семантики Java, -- в общем, не очень, хотя люди пишут как-то. |
Артем Шалхаков, меня настораживает дублирование кода, которое сейчас имеет место, как я понял. И генерация кода - один из способов решения проблемы. Не понимаю, почему ты считаешь, что кодоген - это хрупко. Может я не знаю, что такое хрупкость :-? Хотя вроде знаю: "Неустойчивость, хрупкость (fragile) – система ломается в непредвиденных местах, хотя изменения, которые были проведены до этого, сломанные компоненты явно не затрагивали."
|
x-yuri, это я о том, что тут метапрограммирование может быть overkill, потому что можно просто-напросто делать асинхронные запросы к серверу, который и будет решать, что и кому отдавать. Экономить на запросах тут похоже на размен копеек на копейки, хотя это знает только OP.
Ну и на правах red herring: В посте OP видно зависимость результата от последовательности действий на стороне и клиента, и сервера. В общем случае, долго отлаживать потом придется (причем и на стороне сервера, и на стороне клиента), и что еще хуже, при всяком изменении шаблона придется все перепроверять. Если все-таки хочется именно так, то надо решительно забить на подстановку строк (типа "наш собственный макропроцессор Си"), и внедрить JS в основной язык. Можно будет хоть какие-то проверки переложить на компилятор. |
Цитата:
А по поводу асинхронных запросов не подумал, действительно зачем на клиенте знать о правах, если сервер может просто отклонять действия/не выдавать затребованную информацию Цитата:
|
2 x-yuri
> я не заметил, можешь показать где или почему так решил? Императивный кодец, отборрная вермишель. Хорошо, когда работает, а поставишь где-нибудь что-нибудь не то, и сиди отлаживай, причем сразу на двух уровнях. И тестировать тоже на двух уровнях, и учитывать жуткую динамичность JS. В общем, не айс. ЗЫ сорри за поздний ответ. |
Часовой пояс GMT +3, время: 01:32. |