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

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

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

[Permissions(PermissionType.SomePermissionName, CrudType.CanDelete)] public ActionResult SomeAction() { } 

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

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

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

 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; } 

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

 var permission = PermissionService.GetByName(permissionType.ToString()); 

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

另一个编辑
在您的情况下,为RolePermissions类创建只读属性ExistingPermissions是有意义的,并将四个布尔值合并到该属性getter中的一个CrudType中。 然后你可以做rp.ExistingPermissions.HasFlag(permissionToCheck)

EDITED

感谢@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)); } 

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

使用reflection会对性能产生影响,而后期绑定意味着更改枚举或属性的名称不会被编译器捕获。

另外,这段代码很难理解,因此难以维护。

这里只有4个选项可供检查。 简单的switch语句更简单,更快速,更清晰。

如果您尝试允许更改数据库或第三方组件引入新权限,则使用reflection将有意义。