用户授权

时间:2009-09-19 19:21:05

标签: winforms authorization

我需要开发一个Winforms应用程序,在该应用程序中,用户有权访问分配给它们的菜单条中的菜单项。

我已经预见到以下技术:

(1)菜单条被映射到带有复选框的相应treeView,

(2)从组合框中选择用户

(3)在treeView中检查了一些树视图节点复选框,表示“此用户可以访问这些菜单项”,

(3)按下保存按钮,将选中的树节点和用户保存在数据库中。

在后期阶段,当用户登录系统时,将从数据库中相应地填充Menu-Strip项目。

有人能建议我更好的技术吗?

4 个答案:

答案 0 :(得分:1)

你可以考虑一个榜样。

以这种方式管理用户权限将是一件痛苦的事,并且通常您有一组将执行类似功能的角色。另一个问题是,如果您需要一个灵活的安全模块......

我还会在我的命令中包含这些角色,因此它会验证用户是否具有正确的权限。

答案 1 :(得分:1)

我们在工作中有类似的实施。这是一个非常简单的设计,效果很好。

您可能希望为每个MenuItem添加唯一标识符。这可以很简单:

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

(对此有些影响,我的语法可能稍微偏离)

更新

按照上面的示例,树视图项控件的“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;
}

答案 2 :(得分:0)

我认为你最大的问题是你的安全对象设计和数据库中的“序列化”,你的UI设计或多或少会成为事后的想法,只要您的后备对象/数据库经过深思熟虑就可以改变前端1000倍是您喜欢的任何设计。如果所需的区分级别不是非常广泛,我会建议使用位标志。

那说我不认为你的建议是个坏主意。

答案 3 :(得分:0)

根据您要管理的用户数量,这可能就足够了 - 或者您可能希望通过将用户分配到组和权限(哪个菜单项可见)到组来提供额外的步骤。您也将它存储在数据库中。

更新1

哦,另一个想法可能是存储一个Windows用户/组ID数据库的权限。这样,您可以为单个用户或整个Windows组分配特定的“菜单权限”,而无需在数据库中存储太多内容。用户&lt; - &gt;组映射将在Windows用户管理/ Active目录中完成,而无需实现太多内容。

更新2(因为评论)

要存储权限,我会在数据库中定义一个与用户/组ID和权限ID匹配的表。因此,对于每个权限(例如,一个权限是打开“打印”菜单的权限,右边的另一个权限是执行“编辑”等等...)

所以表格看起来像

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

因此,该数据库表中的每个条目都是特定用户或组与一个特定权限之间的映射。在数据库中,这是一个交叉表,或多对多映射。