-
Notifications
You must be signed in to change notification settings - Fork 8
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Client security checks RFC #10
base: master
Are you sure you want to change the base?
Conversation
3. `accessEntityCheck(model, typeAccess)` - проверка наличия у текущего пользователя полномочий на выполнение заданного типа операций над конкретным переданным объектом | ||
В заглушке предлагается возвращать из всех этих методов RSVP.resolve(true), чтобы по-умолчанию в приложении на ember-flexberry полномочия не контролировались. | ||
При необходимости прикладной разработчик может создать собственную реализацию сервиса `security` или воспользоваться реализацией из аддона ember-flexberry-security. | ||
1. необходимо реализовать хелперы для использования на шаблонах для проверки наличия полномочий на операцию над объектом, а также на именованную операцию |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Помимо использования асинхронных хелперов добавить также режим синхронной проверки полномочий - в этом случае полномочия должны запрашиваться и проверяться до рендеринга формы (в хуке afterModel базового роута). Такое решение позволит избежать "внезапного изменения" внешнего вида формы по мере асинхронной подгрузки полномочий. Для выбора синхронного или асинхронного режима проверки полномочий должна быть предусмотрена соответствующая опция.
Вопрос, который нужно решить в этом случае - делать ли один шаблон для списков с вызовом асинхронных хелперов или в зависимости от значения опции (флага) рендерить разные шаблоны.
text/0000-client-security-checks.md
Outdated
3. `AccessEntityCheck(model, typeAccess)` - проверка наличия у текущего пользователя полномочий на выполнение заданного типа операций над конкретным переданным объектом | ||
|
||
#### ember-flexberry-security: | ||
1. необходимо переопределить `/services/security.js`, реализовав получение данных о полномочиях с сервера посредством ajax-запросов к `SecurityController`. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Необходимо предусмотреть кеширование полномочий на клиенте. Смотри комментарий к разделу "Нерешенные вопросы".
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Отписался выше
text/0000-client-security-checks.md
Outdated
|
||
## Нерешенные вопросы | ||
|
||
Очень хочется кешировать полномочия и результаты проверок на клиенте, но неясно в каком объеме получать данные для кеширования, а также как этот кеш инвалидировать. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Во-первых, необходимо в серверных полномочиях в менеджере полномочий реализовать метод для получения полномочий (сейчас такой метод отсутствует).
Во-вторых, инвалидировать кеш можно через определенный промежуток времени. В настройках приложения необходимо установить интервал проверки "актуальности" полномочий на клиенте (на клиенте должна сохраняться дата/время последней проверки актуальности полномочий). На сервере при этом необходимо предоставить интерфейс для получения информации о дате последнего изменения полномочий. Полномочия с сервера должны отдаваться только в том случае, когда дата/время изменения полномочий на сервере старше, чем на клиенте.
Кроме этого должно быть предусмотрено принудительное обновление кеша полномочий в клиентском приложении с последующим автоматическим обновлением пользовательского интерфейса на текущей (открытой) форме.
Необходимо разработать более конкретные технические описания для кеширования полномочий на клиенте.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
На сервере дата изменений полномочий живёт в полях аудита каждого объекта. Соответственно, достаточно реализовать метод, который сможет возвращать значение максимальной даты полей аудита объектов полномочий.
Кстати, метод принудительного перечитывания полномочий или сброса кеша это ещё один из претендентов на методы сервиса security.js.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Предлагаю добавить к нерешённым вопросам вопрос UI/UX, связанный с асинхронной загрузкой полномочий. При отображении форм данные могут прийти гораздо раньше, чем данные об обновлённых полномочиях. Таким образом пользователю надо каким-то образом сигнализировать, что полномочия подгружаются. Допустим от полномочий зависит доступность для пользователя какой-то кнопки. Пока полномочия не подгрузились каким образом должна выглядеть эта кнопка?
- Её не должно быть и она появится из пустоты?
- Она должна быть заблокирована и разблокируется?
- Она должна быть разблокирована, но по клику выдаст сообщение о не до конца загруженных полномочиях?
Как должен отображаться прогресс загрузки полномочий? В том числе, когда таких кнопок много и они расположены в разных частях интерфейса.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
А сколько времени будет отрабатывать запрос по полям аудита всех объектов полномочий? Что это вообще должен быть за запрос? union all (select EditTime из каждой таблицы полномочий)?
|
||
## Детальное проектирование | ||
|
||
Предлагается внести изменения в два технологических аддона: ember-flexberry и ember-flexberry-security, а также реализовать пакет `NewPlatform.Flexberry.Security.WebApi`, содержащий контроллер, позволяющий запрашивать полномочия через REST API. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Предлагаю оставаться в пределах OData-функций и экшенов, поскольку, возможна ситуация портирования бакенда на другой стек. Чем более стандартным образом описано API, тем проще может быть выполнен перевод.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Мы не нашли толковой реализации даже базовой части спецификации OData на java. Шансы на то, что в другом стеке будет реализована спецификация настолько, что даже odata-функции будут поддержаны, мне кажутся крайне маленькими. При этом одата-функции в текущей реализации не позволяют применять правильный DI и затрудняют декомпозицию, потому что являются просто статическими методами. Кроме того, клиентом данного контроллера может быть не только ember-фронтенд, а также, например, Identity Server и лаконичный RESTful API для данной очень ограниченной предметной области гораздо удобнее использовать, чем пытаться из сторонних клиентов формировать корректные odata-запросы.
Средства для реализации и потребления RESTful API есть в любом языке, в то время как средств для реализации odata мы пока не смогли найти.
Так что я за нормальный WebAPI
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Предлагаю для полномочий использовать все-таки WebAPI по причинам, которые изложил Олег, а также потому, что на прикладных проектах, скорее всего, для подобных задач также уже использовалось WebAPI. Это может облегчить переход.
Думаю также, что работу с полномочиями не обязательно завязывать на те же технологии, что и работу с объектами данных.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Данный функционал очень хорошо ложится в идеалогию микросервиса (на ЕАИС так и сделано).
Сами объекты данных для организации полномочий на клиенте не требуются, достаточны DTO (например, для класса):
{ type: "SomeName", access: ["Read", "Insert"]}
Также часть API должна быть публичной (например, для интеграции с Identity Server), а часть - приватной (получение доступных операций и классов с типами доступа)
text/0000-client-security-checks.md
Outdated
Предлагается внести изменения в два технологических аддона: ember-flexberry и ember-flexberry-security, а также реализовать пакет `NewPlatform.Flexberry.Security.WebApi`, содержащий контроллер, позволяющий запрашивать полномочия через REST API. | ||
|
||
#### ember-flexberry: | ||
1. необходимо создать заглушку для сервиса работы с полномочиями `/services/security.js`. Этот сервис должен содержать ряд методов, похожих на методы интерфейса `NewPlatform.Flexberry.Security.ISecurityManager`. Предлагается добавить следующие методы: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Надо подумать какие ещё методы и операции могут пригодиться на клиенте. Это не обязательно должно один в один совпадать с интерфейсом ISecurityManager, поскольку тут всё завязывается на клиентскую, а не на серверную логику.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
На клиент лучше всего отдавать все необходимые данные одной пачкой, сохранять в браузер на время жизни всей сессии (logout или истечение токена)
text/0000-client-security-checks.md
Outdated
|
||
## Нерешенные вопросы | ||
|
||
Очень хочется кешировать полномочия и результаты проверок на клиенте, но неясно в каком объеме получать данные для кеширования, а также как этот кеш инвалидировать. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
На сервере дата изменений полномочий живёт в полях аудита каждого объекта. Соответственно, достаточно реализовать метод, который сможет возвращать значение максимальной даты полей аудита объектов полномочий.
Кстати, метод принудительного перечитывания полномочий или сброса кеша это ещё один из претендентов на методы сервиса security.js.
2. если у пользователя нет полномочий на создание объектов заданного типа, не показывать кнопки Создать и Создать на основе | ||
3. если у пользователя нет полномочий на удаление объектов заданного типа, не показывать кнопки удаления в тулбаре и в строках | ||
2. лукап во всех вариантах - если у пользователя нет полномочий на чтение объектов заданного типа - показывать лукап в режиме readonly | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Подумать над событийной моделью обновления полномочий (когда перечитали их с сервера и они изменились).
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Отписался выше
text/0000-client-security-checks.md
Outdated
|
||
## Нерешенные вопросы | ||
|
||
Очень хочется кешировать полномочия и результаты проверок на клиенте, но неясно в каком объеме получать данные для кеширования, а также как этот кеш инвалидировать. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Предлагаю добавить к нерешённым вопросам вопрос UI/UX, связанный с асинхронной загрузкой полномочий. При отображении форм данные могут прийти гораздо раньше, чем данные об обновлённых полномочиях. Таким образом пользователю надо каким-то образом сигнализировать, что полномочия подгружаются. Допустим от полномочий зависит доступность для пользователя какой-то кнопки. Пока полномочия не подгрузились каким образом должна выглядеть эта кнопка?
- Её не должно быть и она появится из пустоты?
- Она должна быть заблокирована и разблокируется?
- Она должна быть разблокирована, но по клику выдаст сообщение о не до конца загруженных полномочиях?
Как должен отображаться прогресс загрузки полномочий? В том числе, когда таких кнопок много и они расположены в разных частях интерфейса.
@mao29 @bratchikov
|
|
У Вообще в конструктор На уровне почти всех реализаций
Согласен, можно реализовать так.
Если я правильно понял, речь идет про |
text/0000-client-security-checks.md
Outdated
Хелперы должны внутри вызывать соответствующие методы security-сервиса, но нужно учитывать, что эти методы возвращают промисы, поэтому хелпер должен корректно сообщать шаблону о необходимости перевычислить значение после завершения промиса. | ||
3. доработать базовые роуты | ||
1. для роута редактирования, добавить в beforeModel проверку наличия у текущего пользователя полномочий на заданную модель | ||
1. если у пользователя нет полномочий на чтение объектов заданного типа или на чтение конкретного открываемого на редактирование объекта, осуществлять переход на роут с сообщением о недостаточности полномочий и предложением обратиться к администратору |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
- Внезапно осознал, что лучше бы не на отдельный роут переходить, а просто особый темплейт рендерить, чтобы урл не менялся и пользователи могли скриншоты присылать, по которым понятно было бы на каком роуте проблема
- Еще нужно дать какую-то возможность прикладному разработчику тоже отрендерить экран недостаточности полномочий. Может быть и прикладная логика, запрещающая открывать тот или иной роут, хочется чтобы она консистентно выглядела
- Change SecurityController API - Change security.js API and logic - Change routes logic according to permission checks
…ao29/rfcs into feature-client-security-checks
Написал RFC на клиентские проверки полномочий