Шаблоны проектирования для включения элементов пользовательского интерфейса на основе пользовательских разрешений? - PullRequest
11 голосов
/ 06 июля 2010

У нас есть веб-приложение, и его интерфейс реализован с помощью GWT / GXT.Пользователи могут принадлежать к различным группам, и эти группы могут иметь различные разрешения.Разрешения достаточно детализированы, например, comment_create, comment_edit, comment_delete и comment_read.

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

Ответы [ 5 ]

3 голосов
/ 23 октября 2013

У меня была такая же проблема, вот мое решение.

Каждый компонент пользовательского интерфейса имеет состояние включения / выключения (видимый / скрытый, включенный / отключенный, редактируемый / только для чтения), и состояние может быть связано с одним или несколькими разрешениями. Например, кнопка редактирования может быть включена, если у пользователя есть разрешение РЕДАКТИРОВАТЬ, или отключена в противном случае.

Я создал класс связывателя, который связывает компонент пользовательского интерфейса с разрешением. Связыватель знает текущие разрешения пользователя (все разрешения) через шину событий, где набор разрешений отправляется с использованием события. Каждый раз, когда событие получено, средство связывания проверяет, есть ли разрешение или нет (альтернатива - использовать логическое значение для каждого разрешения) и применяет изменения к компоненту (например, включение или отключение его).

Шина событий является единственным соединением между всеми компонентами пользовательского интерфейса.

Используя Gin и некоторый вспомогательный класс, я получил нечто подобное для кода привязки:

FeatureBinder.bind(editButton, EDIT_PERMISSION);
1 голос
/ 15 января 2014

Безопасность Acris

Посмотрите на Защита клиентов GWT с помощью AcrIS : использование аннотаций для декларативного определения разрешений для элементов управления.Из статьи,

public class CustomerPanel extends SecuredComposite {
...
    @Secured(Grants.SECURITY_MANAGEMENT)
    protected TextBox securityID;
...
}

Хотя подход выглядит очень многообещающим, проект не выглядит таким активным.Страница downloads имеет самый последний выпуск в мае 2012 года и содержит всего несколько сотен загрузок каждой версии (хотя это не учитывает использование в качестве зависимости Maven).Последний на форуме acris - это сообщение от июня 2013 года о переходе на Git.

Кроме того, последняя опубликованная версия совместима с GWT 2.3, а текущие разработки сосредоточены на GWT 2.5.

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

Даже если вы не используете acris, подход - это работа, которую нужно изучить.(Это тот же подход, который упоминался в Авторизация на основе атрибутов , ссылка на которую содержится в комментарии к OP.) Если посмотреть на источник , он выглядит как метапрограммирование с использованием генератора и SourceWriter .

1 голос
/ 06 июля 2010
1 голос
/ 06 июля 2010

Я не уверен, как бы вы реализовали это в GWT / GXT, но старый способ включения меню MFC мог бы послужить местом для запуска.

У этого было отдельное ON_UPDATE_COMMAND_UI сообщение, которое выдал идентификатор меню и имя метода.Метод будет вызван, и вы можете включить или отключить этот пункт меню в зависимости от вашей логики.В вашем случае это будет основано на идентификаторе пользователя.Это для каждого идентификатора меню и, следовательно, настолько детализировано, насколько вам нужно.

0 голосов
/ 08 июля 2011

Вы можете использовать setEnabled(boolean) в ограниченных виджетах и ​​сохранить 2 строки кода по сравнению с if версией:

Button editButton = new Button();
editButton.setText("Edit");
editButton.setEnabled(SecurityManager.userHasPermission(currentUser, Permissions.DOCUMENT_EDIT));
toolbar.add(editButton);

Button deleteButton = new Button();
deleteButton.setText("Delete");
deleteButton.setEnabled(SecurityManager.userHasPermission(currentUser, Permissions.DOCUMENT_DELETE));
toolbar.add(deleteButton);
...