gpt4 book ai didi

.net - Wpf 用户安全策略

转载 作者:行者123 更新时间:2023-12-01 03:32:02 26 4
gpt4 key购买 nike

背景:

我正在创建一个 WPF 应用程序(带有 MVVM-Light 的 .NET 4.5)

我在支持 WPF 应用程序的数据库中创建了用户角色,其中 WPF 应用程序的用户具有分配的角色(即 用户、经理、所有者、管理员)

我想要什么:

我的客户希望能够根据用户的角色限制用户看到的内容和可以执行的操作。所有用户都会看到一些 View ,因此应根据用户角色隐藏或禁用一些视觉元素(网格、按钮等)。

我有什么:

我创建了一个 IUserService,它被注入(inject)到每个 View 模型中。我创建的角色有一个标记其安全级别的字段(只是一个从 1 到 5 的整数)。我希望能够根据这个数字限制视觉元素的可见性。

例如,我的计划是将元素的可见性绑定(bind)到 View 模型(Level1、Level2 等)中的 bool 属性(使用 boolToVisibility 转换器),如果用户级别匹配或更高,该属性将返回 true比属性级别。

我的担忧:

我担心的是,要在每个 View 模型和每个需要的视觉元素上执行大量工作。此外,我已经有了一些受其他业务逻辑影响的视觉元素。

问题:

根据用户角色策略限制用户“查看”视觉元素的能力的有效方法是什么?

我准备开始这项工作,但我很想听听社区关于如何在 WPF 应用程序中实现基于用户角色的安全性的其他想法。

最佳答案

您可以创建一个 attached property确定每个控件的访问级别

public class VisibilitySecurityLevel 
{
public static readonly DependencyProperty SecurityLevelProperty =
DependencyProperty.RegisterAttached("SecurityLevel", typeof(int), typeof(FrameworkElement), new PropertyMetadata(5));

public static void SetSecurityLevel(UIElement element, int value)
{
element.SetValue(SecurityLevelProperty, value);
}
public static int GetSecurityLevel(UIElement element)
{
return (int)element.GetValue(SecurityLevelProperty);
}
}

将其应用到您希望由用户角色管理的控件

    <Button local:VisibilitySecurityLevel.SecurityLevel="3"/>
<CheckBox local:VisibilitySecurityLevel.SecurityLevel="2"/>

使用一个基本的隐式样式,该样式将使用转换器根据它们的安全级别绑定(bind)控件的可见性

       <local:AccessLevelToVisibilityConverter x:Key="AccessLevelToVisibilityConverter"/>
<Style TargetType="{x:Type FrameworkElement}">
<Setter Property="Visibility">
<Setter.Value>
<MultiBinding Converter="{StaticResource AccessLevelToVisibilityConverter}">
<Binding Path="UserRole"/>
<Binding RelativeSource="{RelativeSource Mode=Self}"/>
</MultiBinding>
</Setter.Value>
</Setter>
</Style>

转换器:

public class AccessLevelToVisibilityConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
int userRole = (int)values[0];
int controlAccessLevel = (int)(values[1] as FrameworkElement).GetValue(VisibilitySecurityLevel.SecurityLevelProperty);

return (userRole <= controlAccessLevel) ? Visibility.Visible : Visibility.Hidden;
}

public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotSupportedException();
}
}

请注意,在我的实现中,最低用户角色 5 是最受限制的角色(只能看到访问级别为 5 的控件),用户角色 1 是最有特权的(可以看到访问级别 1 -5 的控件)。这就是默认访问级别为 5 (new PropertyMetadata(5)) 和转换器绑定(bind)到 viewModel 中的整数 UserRole 属性,指示用户的访问权限 (1 - 5)

希望对你有帮助

关于.net - Wpf 用户安全策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19206263/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com