Авторизация пользователя

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

Я предвидел следующую технику:

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

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

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

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

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

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


person user366312    schedule 19.09.2009    source источник


Ответы (4)


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

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

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

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

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(); 
});

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

Обновлять:

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

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;
}
person emptyset    schedule 19.09.2009
comment
На самом деле получить разрешения не так уж и сложно. Я застрял в проверке узлов дерева и сохранении их соответственно. - person user366312; 19.09.2009
comment
Вы можете установить свойство Tag (если оно существует) для элемента в качестве идентификатора. Это делается при заполнении элемента управления древовидным представлением. Обычно это свойство элемента управления, которое содержит ссылку на объект, что позволяет вам пометить элемент любыми метаданными, которые вы хотите. Затем вы можете сохранить по ID в базе данных пункт меню, который был проверен. - person emptyset; 20.09.2009

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

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

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

person Heiko Hatzfeld    schedule 19.09.2009
comment
Что вы лично делаете, чтобы назначить разрешения меню (получение разрешений не так сложно)? - person user366312; 19.09.2009
comment
Мне трудно манипулировать флажками узла treeView. - person user366312; 19.09.2009

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

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

person Quintin Robinson    schedule 19.09.2009
comment
Что вы лично делаете, чтобы назначить разрешения меню (получение разрешений не так сложно)? - person user366312; 19.09.2009
comment
Мне трудно манипулировать флажками узла treeView. - person user366312; 19.09.2009

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

Обновление 1

О, и еще одна идея может заключаться в хранении базы данных идентификаторов пользователей/групп Windows против разрешений. Таким образом, вы можете назначить определенные «разрешения меню» для одного пользователя или целой группы окон без необходимости хранить слишком много в базе данных. Сопоставление пользователя‹->группы будет выполняться в каталоге управления пользователями Windows/Active без необходимости реализовывать слишком много вещей.

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

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

Таким образом, таблица может выглядеть

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

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

person froh42    schedule 19.09.2009
comment
Что вы лично делаете, чтобы назначить разрешения меню (получение разрешений не так сложно)? - person user366312; 19.09.2009
comment
Мне трудно манипулировать флажками узла treeView. - person user366312; 19.09.2009
comment
Когда я только что погуглил для привязки данных winforms treeview, я нашел следующую статью: eggheadcafe.com/articles/treeview_databinding. жерех - person froh42; 19.09.2009