检查方法权限的属性用法

本文关键字:属性 用法 权限 方法 检查 | 更新日期: 2023-09-27 18:09:44

我正在尝试实现一个安全机制来自动测试一个特定的插件权限和方法安全特权,我已经得到了一点卡住如何得到这个工作

我写了一个自定义的MEF元数据属性,它接受一个构造函数属性,如:

params PluginPermission[] permission

包含插件被授予的所有权限的数组。

PluginPermission类看起来像:

PluginPermission.cs
public enum PluginPermission
{
    CreateUsers,
    DeleteUsers,
    ReadPassword,
    WritePassword,
    AddUsersToGroups,
    AddGroups,
    DeleteGroups
}

我还写了一个RequiredPermissionAttribute,它针对单个方法,并接受一个或多个PluginPermission对象来告诉系统执行单个方法需要什么权限。这些应用于插件的接口,如:

 ILicensingManagement.cs
 [RequiredPermission(PluginPermission.CreateUsers)]
 bool AddUser(string userName);

显然,如果插件没有特定方法所需的权限,则该方法不会执行。

我卡住的是如何在RequiredPermissionAttribute类中实际获得测试方法,以便在执行方法之前运行,以及如果插件不满足该方法的权限要求,如何优雅地退出执行。

我看了看xUnit BeforeAfterTestAttribute,但实现似乎太具体了,我努力把源代码分开来得出解决方案。

检查方法权限的属性用法

我不能评论MEF特定的事情,但有一件事要记住,自定义属性只不过是"标签",它们不做任何事情,除非你的代码特别检查它们,例如使用反射。

xUnit的BeforeAfterTestAttribute可能工作,因为xUnit使用反射来执行方法。当它遇到这个属性时,它会相应地改变它的行为。

. net框架命名空间中的属性可以工作,因为要么CLR检查它们,要么编译器检查它们。

我知道这并不能完全回答你的问题,但是把它放在评论中有点太长了。

更新:你可以使用Type访问属性,如果它是一个类或MethodInfo,如果它是一个方法,例如

MethodInfo mi = /* method info */;
Attribute[] attrs = mi.GetCustomAttributes(typeof(RequiredPermissionAttribute), false);
RequiredPermissionAttribute req = attrs.Cast<RequiredPermissionAttribute>().FirstOrDefault();
if ((req != null) && (/* current user does not have the required permission */)) throw new Exception();

但这不是一个真正的安全解决方案,开发人员可以很容易地避免这些检查。我只是粗略地浏览了一下,但是PostSharp也许可以帮到你。