【问题标题】:User Authorization用户授权
【发布时间】:2009-09-20 05:05:10
【问题描述】:

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

我已经预料到了以下技术:

(1)Menu Strip用checkBoxes映射到对应的treeView中,

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

(3) 在 treeView 中选中了一些树视图节点复选框,以表明“该用户将能够访问这些菜单项”,

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

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

谁能给我建议更好的技术?

【问题讨论】:

    标签: winforms authorization


    【解决方案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;
    }
    

    【讨论】:

    • 实际上检索权限并不难。我坚持检查树节点并相应地保存它们。
    • 您可以将项目的“标签”属性(如果存在或类似属性)设置为 ID。这是在您填充树视图控件时完成的。这通常是控件上的一个属性,它包含一个对象引用,它允许您使用所需的任何元数据“标记”项目。然后你可以通过ID在数据库中保存被检查的菜单项。
    【解决方案2】:

    你可以考虑一个榜样。

    以这种方式管理用户权限会很痛苦,而且通常您有一组角色可以执行类似的功能。另一个问题是您是否需要一种灵活的安全模型...

    我还会在我的命令中包含这些角色,以便验证用户是否拥有正确的权限。

    【讨论】:

    • 你个人做了什么来分配菜单权限(检索权限并不难)?
    • 我发现 treeView-node 复选框难以操作。
    【解决方案3】:

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

    也就是说,我不认为你的建议是一个坏主意。

    【讨论】:

    • 你个人做了什么来分配菜单权限(检索权限并不难)?
    • 我发现 treeView-node 复选框难以操作。
    【解决方案4】:

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

    更新 1

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

    更新 2(由于评论)

    为了存储权限,我会在数据库中定义一个匹配用户/组 ID 和权限 ID 的表。所以对于每个权限(一个权限是例如打开“打印”菜单的权限,另一个权限是做“编辑”等等......)

    所以表格看起来像

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

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

    【讨论】:

    • 你个人做了什么来分配菜单权限(检索权限并不难)?
    • 我发现 treeView-node 复选框难以操作。
    • 当我刚刚搜索“winforms treeview 数据绑定”时,我发现了以下文章:eggheadcafe.com/articles/treeview_databinding.asp
    猜你喜欢
    • 1970-01-01
    • 2021-10-23
    • 2014-06-25
    • 1970-01-01
    • 2019-09-27
    • 1970-01-01
    • 2022-08-19
    • 2011-04-17
    • 2019-03-07
    相关资源
    最近更新 更多