使用反射和枚举来进行MVC应用程序访问的逻辑控制是否安全?

Shy*_*mep 7 c# database reflection enums asp.net-mvc-3

试图管理对网站的访问我创建了一些必要的实体 在此输入图像描述

目标是为我的MVC应用程序的某些控制器的操作方法使用自定义权限属性.

[Permissions(PermissionType.SomePermissionName, CrudType.CanDelete)]
public ActionResult SomeAction()
{
}
Run Code Online (Sandbox Code Playgroud)

对于这个操作,我有两个枚举

[Flags]
public enum CrudType
{
    CanCreate = 0x1,
    CanRead = 0x2,
    CanUpdate = 0x4,
    CanDelete = 0x8,
}

[Flags]
public enum PermissionType
{
   SomePermissionName = 0x1,
   //... 
}
Run Code Online (Sandbox Code Playgroud)

现在我想要下面的方法来检查权限

public static bool CanAccess(RolePermissions rp, CrudType crudType)
{
    var pInfo = rp.GetType().GetProperties();
    var res = pInfo.FirstOrDefault(x => x.Name == crudType.ToString());
    if(res != null)
    {
        return Convert.ToBoolean(res.GetValue(rp, null));
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)

它运作良好,但在这里使用反射是否安全?这是一种好风格吗?
还有一个问题是关于这样的代码

var permission = PermissionService.GetByName(permissionType.ToString());
Run Code Online (Sandbox Code Playgroud)

在这里,我试图从PermissionType枚举中使用一些命名常量从数据库中获取权限对象.
在这两种情况下,正确的工作取决于枚举与某些表字段或记录之间的关系.另一方面,我有一个很好的控制逻辑机制(在我看来).这是一个好方法吗?

Yak*_*ych 3

另一种编辑在您的情况下,为该类
创建一个只读属性是有意义的,并将四个布尔值合并为该属性获取器中的一个。那么你就可以这样做了。ExistingPermissionsRolePermissionsCrudTyperp.ExistingPermissions.HasFlag(permissionToCheck)

编辑

感谢@DevDelivery 指出了这个问题 - 很好。不幸的是,固定的解决方案并不像我希望的那么漂亮,所以在这种情况下,采用 @DevDelivery 的方法可能是有意义的。

由于您有CrudType“位字段”,因此您可以使用更干净的方法(更少的代码和更好的可读性):

public static bool CanAccess(RolePermissions rp, CrudType permissionToCheck)
{
    CrudType existingPermissions = 
                                SetPermissionFlag(CrudType.CanCreate, rp.CanCreate) |
                                SetPermissionFlag(CrudType.CanRead, rp.CanRead) | 
                                SetPermissionFlag(CrudType.CanUpdate, rp.CanUpdate) |
                                SetPermissionFlag(CrudType.CanDelete, rp.CanDelete);

    return existingPermissions.HasFlag(permissionToCheck);
}

public static CrudType SetPermissionFlag(CrudType crudType, bool permission)
{
    return (CrudType)((int)crudType * Convert.ToInt32(permission));
}
Run Code Online (Sandbox Code Playgroud)

与您的解决方案相比,缺点是您必须修改此方法,以防您添加更多操作(添加到现有的操作CanRead等)。