Авторизация пользователя - PullRequest
1 голос
/ 19 сентября 2009

Мне нужно разработать приложение Winforms, где пользователям предоставляются разрешения на доступ к пунктам меню в полосе меню, как им назначено.

Я ожидал следующую технику:

(1) Полоса меню отображается в соответствующее древовидное представление с флажками,

(2) Пользователь выбирается из поля со списком,

(3) Некоторые флажки древовидного узла отмечены в treeView, чтобы указать, что «этот пользователь сможет получить доступ к этим пунктам меню»,

(3) Нажата кнопка сохранения, чтобы сохранить проверенные древовидные узлы и пользователя в БД.

На более поздних этапах, когда пользователь входит в систему, элементы меню-полосы заполняются соответственно из БД.

Может кто-нибудь предложить мне лучшую технику?

Ответы [ 4 ]

1 голос
/ 19 сентября 2009

У нас похожая реализация на работе. Это довольно простой дизайн и хорошо работает.

Возможно, вы захотите добавить уникальный идентификатор для каждого элемента MenuItem. Это может быть так просто, как:

public enum MenuItems
{
    File_New = 100,
    File_Save = 110,
    // ...
} 

И вы включаете этот номер в базу данных. Затем, когда вы записываете пункты меню, у вас может быть словарь, который отображает целое число MenuItems на делегат (для обработки события execute):

delegate void MenuItemExecuteHandler();
IDictionary<int, MenuItemExecuteHandler> MenuItemHandlers;

И где-то определим отображения:

MenuItemHandlers.Add(MenuItems.File_New, this.OnFileNewClick());

Чтобы при подключении обработчиков событий элемента меню можно было вызвать правильный метод для выполнения правильного действия:

int id = 100; // Retrieved from the database.
MenuItems menuItem = (MenuItems)Enum.TryParse(typeof(MenuItems), id);
string command = "..."; // Retrieved from the database using the MenuItem ID.
MenuItemControl control = new MenuItemControl();
control.Text = command;
control.OnClick += new EventHandler(delegate (object sender, EventArgs args) 
{ 
    MenuItemHandlers[menuItem].Invoke(); 
});

(Что-то на этот счет, у меня, вероятно, синтаксис немного отключен)

Обновление:

Свойство «Tag» элемента управления древовидного представления заполняется следующим образом:

TreeItemControl control = new TreeItemControl();
control.Text = "New File"; // Retrieved from database.
control.Tag = 100; // Retrieved from database.

Тогда при поиске что выписать:

if (control.CheckState = CheckState.Checked)
{
   row["MenuItemID"] = control.Tag;
   row["Allowed"] = true;
}
1 голос
/ 19 сентября 2009

Можно подумать о образце для подражания.

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

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

0 голосов
/ 19 сентября 2009

В зависимости от количества пользователей, которыми вы будете управлять, этого может быть достаточно - или вам может потребоваться выполнить дополнительный шаг, назначив пользователей группам и разрешениям (какой элемент меню отображается) для групп. Вы бы также сохранили его в базе данных.

Обновление 1

Да, и другая идея может заключаться в хранении базы данных прав доступа к идентификаторам пользователей / групп Windows. Таким образом, вы можете назначить определенные «права доступа к меню» для отдельного пользователя или всей группы окон без необходимости хранить слишком много данных в базе данных. Пользователь <-> сопоставление групп будет затем выполнено в Windows user management / Active directory без необходимости реализовывать слишком много вещей.

Обновление 2 (из-за комментария)

Для хранения разрешений я бы определил таблицу в базе данных, которая соответствует идентификатору пользователя / группы и идентификатору разрешения. Таким образом, для каждого разрешения (одно разрешение - это, например, право открывать меню «Печать», другое - право редактировать и т. Д.)

Так что стол может выглядеть как

 user/group id           permission
 ----------------------------------
 1-332-1345-5453         OpenFile
 1-332-1345-5453         Edit
 1-254-1345-5412         OpenFile

Таким образом, каждая запись в этой таблице БД будет отображаться между конкретным пользователем или группой и одним конкретным разрешением. В базе данных говорят, что это кросс-таблица, или отображение многих ко многим.

0 голосов
/ 19 сентября 2009

Я думаю, что вашей самой большой проблемой будет разработка вашего объекта безопасности и «сериализация» в базу данных, ваш дизайн пользовательского интерфейса может быть более или менее запоздалым, если ваши вспомогательные объекты / база данных хорошо продуманы, вы можете изменить передний конец в 1000 раз больше, чем вам нравится. Я бы порекомендовал битовые флаги, если требуемый уровень различия не очень широк.

Тем не менее, я не думаю, что вы предложили, это плохая идея.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...