基于Unity的AOP的符合基于角色的访问控制(RBAC)模型的通用权限设计

简介:

AOP的特性使得它非常适合用来设计类似权限控制的功能,这是本文的基础,如果想要了解AOP的实现,可以参考《动态织入的AOP实现》。

在基于角色的访问控制(RBAC)中,有三要素:用户、角色、任务(或操作)(User、Role、Task),其稳定性逐渐增强,两个关系,User<->Role、Role<->Task,其中:

  • User 是日常管理运行时建立
  • Role 是部署/交付建立
  • Task 是开发时确定
  • User<->Role 是日常管理运行时建立
  • Role<->Task 是部署/交付时建立

在本例中,针对Task和Role,我们设计如下的两个类:

[AttributeUsage(AttributeTargets.All, AllowMultiple = false , Inherited = true )]
public  class  TaskAttribute: Attribute
{
 
     public  TaskAttribute( string  taskName, string  taskDescription)
     {
         TaskName = taskName;
         TaskDescription = taskDescription;
     }
 
     public  string  TaskName { get ; set ; }
     public  string  TaskDescription { get ; set ; }
}
 
public  class  Role
{
     public  string  Name { get ; set ; }
     public  List<TaskAttribute> Tasks { get ; set ; }
}

可以看到,Task是继承自Attribute的,源于Task需要和实际的功能接口匹配起来,而Role,则无此需要。

本文演示所需要的权限关系描述如下:

1:系统有4个权限;

2:系统有两个角色,一个叫做Manager,它具有两个权限,另一个角色为Common,它当前不具备任何权限;

以上的关系描述,我们在代码当中模拟如下:

//模拟系统总共有4种权限
public  static  List<TaskAttribute> Tasks
{
     get
     {
         if  (_tasks == null )
         {
             _tasks = new  List<TaskAttribute>()
                          {
                              new  TaskAttribute( "AddItem" , "增加" ),
                              new  TaskAttribute( "ModifyItem" , "修改" ),
                              new  TaskAttribute( "RemoveItem" , "删除" ),
                              new  TaskAttribute( "ListItem" , "获取列表" )
                          };
         }
         return  _tasks;
     }
}
 
private  static  List<Role> _roles;
 
//模拟系统总共有两类角色
//第一类角色Manager,有增加和修改权限
//第二类角色Common,没有任何权限
public  static  List<Role> Roles
{
     get
     {
         if  (_roles == null )
         {
             _roles = new  List<Role>()
                         {
                             new  Role(){Name = "Manager" , Tasks = new  List<TaskAttribute>()
                                                               {
                                                                     new  TaskAttribute( "AddItem" , "增加" ),
                                                                     new  TaskAttribute( "ModifyItem" , "修改" )
                                                               }},
                             new  Role(){Name = "Common" , Tasks = new  List<TaskAttribute>()}
                         };
         }
         return  _roles;
     }
}

权限判断在切面部分,简化如下(可以看到是判断当前用户是否具有相关权限):

public  class  AuthorityHandler : ICallHandler
{
     /// <summary>
     /// Invoke order
     /// </summary>
     public  int  Order { get ; set ; }
     public  IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext)
     {
         MethodBase mb = input.MethodBase;
         object [] attrObj = mb.GetCustomAttributes( typeof (TaskAttribute), false );
 
         if  (attrObj == null )
         {
             throw  new  ArgumentException( "TaskAttribute should be defined with the AuthorityAttribute" );
         }
         else
         {
             TaskAttribute attr = (TaskAttribute)attrObj[0];
             if  (! string .IsNullOrEmpty(attr.TaskName))
             {
                 string  taskName = attr.TaskName;
                 //get current user's roles
                 IEnumerable<Role> currentUserRoles = from  p in  SampleApp.Roles where  p.Name == SampleApp.User.Name select  p;
                 //if match then return;
                 foreach  (Role currentUserRole in  currentUserRoles)
                 {
                     IEnumerable<TaskAttribute> tasks = from  p in  currentUserRole.Tasks
                                                        where  p.TaskName == taskName
                                                        select  p;
                     if  (tasks.Count() > 0)
                     {
                         var  retvalue = getNext()(input, getNext);
                         return  retvalue;
                     }
                 }
                 //else throw exception
                 throw  new  UnauthorizedAccessException( "access denied" );
             }
         }
         return  null ;
     }
}
 
public  class  AuthorityAttribute : HandlerAttribute
{
     public  override  ICallHandler CreateHandler(IUnityContainer container)
     {
         return  new  AuthorityHandler();
     }
}

调用方代码:

static  void  Main() {
     var  container1 = new  UnityContainer()
         .AddNewExtension<Interception>()
         .RegisterType<IBiz, Biz1>();
     container1
         .Configure<Interception>()
         .SetInterceptorFor<IBiz>( new  InterfaceInterceptor());
 
     SampleApp.User = new  User() { Name = "Common"  };
     var  sample1 = container1.Resolve<IBiz>();
     sample1.AddItem();
     
     Console.ReadKey();
}

可以看到,使用了Unity来进行AOP;

运行效果:

image


本文转自最课程陆敏技博客园博客,原文链接:http://www.cnblogs.com/luminji/archive/2012/01/13/2321896.html,如需转载请自行联系原作者

相关文章
|
4月前
|
人机交互 开发工具 vr&ar
使用Unity引擎开发Rokid主机应用的模型交互操作
本文介绍如何使用Unity引擎结合Rokid OpenXR Plugin开发空间计算应用,实现射线交互、模型操作等功能。涵盖环境配置、Demo导入、UI搭建与脚本编写,助力开发者快速构建AR交互应用。
|
算法 测试技术 vr&ar
Unity Vufoia+AR模型抖动的问题
**图像识别与跟踪精度问题**:Vuforia 依赖特征点检测,环境光线不稳定、目标纹理不丰富或遮挡会导致特征点匹配误差,引起AR模型抖动。跟踪丢失和重定位延迟也会导致模型不稳定。 **设备硬件与性能问题**:移动设备摄像头易受手持抖动影响,低性能设备无法及时处理图像数据,导致跟踪结果更新延迟。 **模型与坐标系问题**:AR模型重心设置不合理或坐标系转换误差,会使模型在虚拟空间中不稳定。 **算法与参数设置问题**:跟踪算法局限性和参数设置不合理(如灵敏度过高或平滑度过低)都会影响跟踪稳定性。 。
|
安全 网络安全 数据安全/隐私保护
访问控制列表(ACL)是网络安全中的一种重要机制,用于定义和管理对网络资源的访问权限
访问控制列表(ACL)是网络安全中的一种重要机制,用于定义和管理对网络资源的访问权限。它通过设置一系列规则,控制谁可以访问特定资源、在什么条件下访问以及可以执行哪些操作。ACL 可以应用于路由器、防火墙等设备,分为标准、扩展、基于时间和基于用户等多种类型,广泛用于企业网络和互联网中,以增强安全性和精细管理。
2043 7
|
6月前
|
人工智能 定位技术 C#
【Unity3D实例-功能-移动】通过鼠标点击进行角色移动
本文介绍了如何在Unity中实现鼠标点击控制角色移动的功能。通过安装导航网格、设置地图与角色、烘焙路径及编写脚本,带领读者一步步构建角色自动寻路系统,增强游戏交互体验。
348 0
|
7月前
|
图形学 开发者
【Unity3D实例-功能-移动】角色移动-通过WSAD(CharacterController方式)
本文介绍了如何在Unity中使用CharacterController组件实现角色灵活移动。内容包括模型准备、动画处理、添加组件、编写移动脚本及测试运行,帮助开发者快速掌握角色控制技巧,打造流畅的游戏体验。
349 0
|
7月前
|
C# 图形学 开发者
【Unity3D实例-功能-移动】角色移动-通过WSAD(Rigidbody方式)
本文介绍了如何在Unity中使用Rigidbody组件实现角色自由移动,包括模型准备、组件添加、脚本编写与测试运行,帮助开发者快速掌握基础角色控制技巧。
318 0
|
7月前
|
C# 图形学
【Unity3D实例-功能-移动】角色移动-通过WSAD(Transform方式)
本文介绍了如何在Unity中实现角色移动功能,使用Transform组件控制角色基础移动,并详细讲解了模型导入、动画设置、动画控制器配置及移动脚本编写等内容,适合Unity初学者学习角色控制的基础知识。
292 0
|
11月前
|
数据安全/隐私保护
课时105:访问控制权限
面向对象开发的三大特点为封装、继承和多态。封装涉及属性和结构的封装及访问权限控制,主要通过四种访问修饰符实现:Private、Default、Protected 和 Public。继承围绕接口展开,多态实现参数统一。封装中,属性定义用 Private,方法定义用 Public,可解决大部分设计问题。示例代码展示了不同包中的类如何通过 Protected 访问父类属性。
160 1
|
12月前
|
安全 BI 数据安全/隐私保护
基于条件的访问控制——RBAC
基于角色的访问控制(RBAC)根据员工的角色和职责分配权限,确保用户仅能访问所需资源,降低数据泄露风险。通过ADManager Plus等工具,企业可以高效管理权限,减少手动操作,提升安全性并保护敏感信息。RBAC的核心原则是最小权限,即只为员工分配完成工作所需的权限。这不仅提高了工作效率,还减少了未经授权访问的风险,是防范网络威胁的有效手段。
250 3
|
安全 网络安全 数据安全/隐私保护
访问控制列表(ACL)是网络安全管理的重要工具,用于定义和管理网络资源的访问权限。
访问控制列表(ACL)是网络安全管理的重要工具,用于定义和管理网络资源的访问权限。ACL 可应用于路由器、防火墙等设备,通过设定规则控制访问。其类型包括标准、扩展、基于时间和基于用户的ACL,广泛用于企业网络和互联网安全中,以增强安全性、实现精细管理和灵活调整。然而,ACL 也存在管理复杂和可能影响性能的局限性。未来,ACL 将趋向智能化和自动化,与其他安全技术结合,提供更全面的安全保障。
1098 4