基于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,如需转载请自行联系原作者

相关实践学习
消息队列+Serverless+Tablestore:实现高弹性的电商订单系统
基于消息队列以及函数计算,快速部署一个高弹性的商品订单系统,能够应对抢购场景下的高并发情况。
云安全基础课 - 访问控制概述
课程大纲 课程目标和内容介绍视频时长 访问控制概述视频时长 身份标识和认证技术视频时长 授权机制视频时长 访问控制的常见攻击视频时长
相关文章
|
2月前
|
图形学 C#
超实用!深度解析Unity引擎,手把手教你从零开始构建精美的2D平面冒险游戏,涵盖资源导入、角色控制与动画、碰撞检测等核心技巧,打造沉浸式游戏体验完全指南
【8月更文挑战第31天】本文是 Unity 2D 游戏开发的全面指南,手把手教你从零开始构建精美的平面冒险游戏。首先,通过 Unity Hub 创建 2D 项目并导入游戏资源。接着,编写 `PlayerController` 脚本来实现角色移动,并添加动画以增强视觉效果。最后,通过 Collider 2D 组件实现碰撞检测等游戏机制。每一步均展示 Unity 在 2D 游戏开发中的强大功能。
102 6
|
5月前
|
安全 网络安全 数据安全/隐私保护
【专栏】IT 知识百科:访问控制列表(ACL)是网络安全的关键机制,用于定义和管理网络资源的访问权限
【4月更文挑战第28天】访问控制列表(ACL)是网络安全的关键机制,用于定义和管理网络资源的访问权限。ACL工作原理包括定义规则、匹配规则和执行操作。标准ACL基于源IP过滤,扩展ACL则提供更多筛选条件。时间及用户基础的ACL提供更细化的控制。优点在于增强安全性和精细管理,但管理复杂性和性能影响也是挑战。未来,ACL将趋向智能化和自动化,与更多安全技术结合,以提升网络安全。**
344 0
|
2月前
|
安全 数据安全/隐私保护 开发者
|
2月前
|
开发者 图形学 C#
深度解密:Unity游戏开发中的动画艺术——Mecanim状态机如何让游戏角色栩栩如生:从基础设置到高级状态切换的全面指南,助你打造流畅自然的游戏动画体验
【8月更文挑战第31天】Unity动画系统是游戏开发的关键部分,尤其适用于复杂角色动画。本文通过具体案例讲解Mecanim动画状态机的使用方法及原理。我们创建一个游戏角色并设计行走、奔跑和攻击动画,详细介绍动画状态机设置及脚本控制。首先导入动画资源并添加Animator组件,然后创建Animator Controller并设置状态间的转换条件。通过编写C#脚本(如PlayerMovement)控制动画状态切换,实现基于玩家输入的动画过渡。此方法不仅适用于游戏角色,还可用于任何需动态动画响应的对象,增强游戏的真实感与互动性。
61 0
|
2月前
|
图形学 机器学习/深度学习 人工智能
颠覆传统游戏开发,解锁未来娱乐新纪元:深度解析如何运用Unity引擎结合机器学习技术,打造具备自我进化能力的智能游戏角色,彻底改变你的游戏体验——从基础设置到高级应用全面指南
【8月更文挑战第31天】本文探讨了如何在Unity中利用机器学习增强游戏智能。作为领先的游戏开发引擎,Unity通过ML-Agents Toolkit等工具支持AI代理的强化学习训练,使游戏角色能自主学习完成任务。文章提供了一个迷宫游戏示例及其C#脚本,展示了环境观察、动作响应及奖励机制的设计,并介绍了如何设置训练流程。此外,还提到了Unity与其他机器学习框架(如TensorFlow和PyTorch)的集成,以实现更复杂的游戏玩法。通过这些技术,游戏的智能化程度得以显著提升,为玩家带来更丰富的体验。
43 0
|
3月前
|
存储 Shell API
Casbin是一个强大的、开源的访问控制库,支持访问控制模型如ACL、RBAC、ABAC等。
Casbin是一个强大的、开源的访问控制库,支持访问控制模型如ACL、RBAC、ABAC等。
|
4月前
|
图形学
【推荐100个unity插件之9】分享几个完全免费的2D角色动画生成器(推荐收藏)
【推荐100个unity插件之9】分享几个完全免费的2D角色动画生成器(推荐收藏)
193 0
|
4月前
|
图形学
初识Unity——基本模型、场景操作、世界坐标系和局部坐标系
初识Unity——基本模型、场景操作、世界坐标系和局部坐标系
89 1
|
4月前
|
Java 数据安全/隐私保护
Java基础手册二(类和对象 对象创建和使用 面向对象封装性 构造方法与参数传递 this关键字 static关键字 继承 多态 方法覆盖 final关键字 访问控制权限修饰符)
Java基础手册二(类和对象 对象创建和使用 面向对象封装性 构造方法与参数传递 this关键字 static关键字 继承 多态 方法覆盖 final关键字 访问控制权限修饰符)
33 0
|
4月前
|
图形学
【unity小技巧】unity最完美的CharacterController 3d角色控制器,实现移动、跳跃、下蹲、奔跑、上下坡、物理碰撞效果,复制粘贴即用
【unity小技巧】unity最完美的CharacterController 3d角色控制器,实现移动、跳跃、下蹲、奔跑、上下坡、物理碰撞效果,复制粘贴即用
186 0