c# - .NET WinForms 中 UI 元素的授权

标签 c# .net user-interface authorization aop

我有一个关于为应用程序角色授权 UI 元素的最佳方法的一般性问题。我的意思是管理员可以看到普通用户看不到的按钮、菜单项等。这方面的最佳做法是什么?

我意识到可能有多个基于角色的屏幕(一个管理屏幕、为用户复制的同一屏幕等),这看起来确实有点过分了。我还想保持关注点分离,这样我的授权码就不会与显示功能混合在一起。换句话说,我想避免:

if( current_user.IsInRole("administrator") )
  button.Enabled = true;

我一直在用 PostSharp 查看 Aspects,这似乎几乎正是我想做的,但它似乎并没有在逻辑上扩展到 UI。

我确定我错过了什么,那是什么?

谢谢-

最佳答案

您的代码似乎最终会编译一个 UI 元素列表以隐藏或执行给定操作,然后根据当前角色执行这些操作。有点像

Dictionary<Control, Action<Control, string>> actions = new Dictionary<Control, Action<Control, string>>
{
    { button, (c, r) => c.Enabled = (r == "administrator") },
    // etc.
};

您如何编译该列表主要是您的问题所关心的。 AOP 框架肯定有助于分离关注点,但自制解决方案并非不可能。我在想类似的东西:

  • 创建一个 EnableForRoleAttribute,参数为 role
  • 反射(reflection)您的表单(可能使用反射来查找表单,或者可能直接将它们提供给您的代码,甚至查找用您创建的 RoleVaryingAttribute 装饰的表单)。
  • 考虑表单的字段,过滤 Control 实例,然后使用 EnableForRoleAttribute 过滤 Control 实例。
  • 现在您有了 list !根据角色设置Enabled

上面的项目符号列表特定于您的 Enabled 示例,主要是因为属性不能将 lambda 作为参数:(。您可以更灵活地使用 SetPropertyIfInRoleAttribute参数 rolepropertyNamepropertyValue。或任何此类构造。

基本上,AOP 框架可以让您更轻松地完成这项工作,而像 PostSharp 这样的框架可以在编译时而不是运行时进行。但是自制解决方案也非常有效。

关于c# - .NET WinForms 中 UI 元素的授权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4461273/

相关文章:

c# - .net Grpc 请求协议(protocol) 'HTTP/1.1' 不受支持

c# - using 语句中使用的类型必须可隐式转换为 'System.IDisposable'

c# 泛型 "in"关键字

c# - 注册用户 asp.net 身份模型错误

.net - 如何使用 ASP.net Google 分析 api 版本 3(Google.Apis.Analytics.v3.dll) 发送 Google 分析报告查询?

c# - 如何检查程序集 (dll) 的版本?

.net - 在AD中搜索objectGUID

java - GUI 没有出现在 IntelliJ IDEA 中

android - 多个屏幕尺寸的 TableLayout?

javascript - jQuery UI 组合 slider 百分比