EsbAOP应用--权限管理

简介: 前文介绍了异常关闭器的AOP实现,而权限管理也是一个AOP可以大展拳脚的地方,下面就来看看如何使用EsbAOP实现权限管理。    首先要解决的问题是如何判断用户是否拥有调用某个操作的权限,这个判断是由各个应用程序自己实现了,为了统一对权限的判断,所以我们指定了接口IPermissionVerifier:     ///     /// IPermissionVerifier 用于验证当前用户对目标类的目标方法的调用权限是否足够。

    前文介绍了异常关闭器的AOP实现,而权限管理也是一个AOP可以大展拳脚的地方,下面就来看看如何使用EsbAOP实现权限管理。
    首先要解决的问题是如何判断用户是否拥有调用某个操作的权限,这个判断是由各个应用程序自己实现了,为了统一对权限的判断,所以我们指定了接口IPermissionVerifier:

    ///   <summary>
    
///  IPermissionVerifier 用于验证当前用户对目标类的目标方法的调用权限是否足够。
    
///  如果需要使用Aop来进行权限管理,则要实现IPermissionVerifier接口。    
    
///   </summary>
     public   interface  IPermissionVerifier
    {
        
bool  QualifiedToOperation( object  permissionNeeded , string  destClassFullName , string  destMethodName) ;
    }

    其中,permissionNeeded通过应用于方法的特性的参数指定(后面可以看到),destClassFullName表示目标方法所在class的全称,destMethodName是目标方法名。
    当用户的权限不满足条件时,对目标方法的调用将抛出PermissionLimittedException异常,该异常定义如下:

    ///   <summary>
    
///  当没有权限的用户调用某项操作时,将抛出此异常
    
///   </summary>
    [Serializable]
    
public   class  PermissionLimittedException : Exception
    {
        
public  PermissionLimittedException()
        {
        }

        
public  PermissionLimittedException( string  msg): base (msg)
        {            
        }

        
public  PermissionLimittedException( string  msg ,Exception innerException) :  base (msg ,innerException)
        {            
        }
    }

    注意,自定义异常必须是可序列化的,这样就可以保证异常通过remoting传递。

    接下来,就可以实现权限方面PermissionAspect了。

    ///   <summary>
    
///  PermissionAspect  权限方面,如果当前用户不够权限调用某个方法,则抛出PermissionLimittedException。
    
///  aspectClassArgument :实现了IPermissionVerifier接口的类型
    
///  aspectMethodArgument:操作所需的权限,由用户自定义    
    
///   </summary>
     public   class  PermissionAspect :IAspect
    {
        
public  PermissionAspect()
        {
        }
        
        
#region  IAspect 成员
        
public   void  PreProcess(IMethodCallMessage requestMsg,  object  aspectClassArgument,  object  aspectMethodArgument)
        {
            Type verifierType 
=  (Type)aspectClassArgument ;
            Type destType     
=   typeof (IPermissionVerifier) ;
            
if ( !  destType.IsAssignableFrom(verifierType))
            {
                
throw   new  Exception( " the PermissionVerifierType is invalid ! " ) ;
            }

            IPermissionVerifier pmVerifier 
=  (IPermissionVerifier)Activator.CreateInstance(verifierType) ;
            
if (pmVerifier  ==   null )
            {
                
throw   new  Exception( " the PermissionVerifierType is invalid ! " ) ;
            }
            
            
object  pmNeeded    =  aspectMethodArgument ;
            
string  className   =  AopHelper.GetFullClassName(requestMsg) ;
            
string  methodName  =  AopHelper.GetMethodName(requestMsg) ;

            
bool  qualified  =  pmVerifier.QualifiedToOperation(pmNeeded ,className ,methodName) ;

            
if ( !  qualified)
            {
                
throw   new  PermissionLimittedException( string .Format( " Current user have no permission to call dest method : {0}.{1}! "  ,className ,methodName)) ;
            }
        }

        
public   void  PostProcess(IMethodCallMessage requestMsg,  ref  IMethodReturnMessage respond,  object  aspectClassArgument,  object  aspectMethodArgument)
        {
            
//  TODO:  添加 PermissionAspect.EnterpriseServerBase.Aop.ComplexAop.IAspect.PostProcess 实现
        }
    
        
#endregion
    }    

    关于aspectClassArgument 和aspectMethodArgument的含义注释中已经给出了,如果要知道这两个参数是如何使用的,可以回顾EsbAOP实现中的说明。权限方面在前处理的时候,根据IPermissionVerifier判断用户是否满足权限要求,如果不满足,则引发PermissionLimittedException异常。

    最后给出一个示例:

    public   class  class1
    {
        [STAThread]
        
static   void  Main( string [] args)
        {
            
try
            {
                Example exa 
=   new  Example() ;        
                exa.SayHello(
" sky " ) ;
                exa.SayByebye(
" sky " ) ;                    
            }
            
catch (Exception ee)
            {
                Console.WriteLine(ee.Message) ;                
            }

            Console.Read() ;
        }
    }    

    [Aspect(
typeof (PermissionAspectWrap))]        
    
public   class  Example :ContextBoundObject
    {                
        [AspectSwitcher(
typeof (PermissionAspectWrap) , true  ,Permission.Common)]       
        
public   void  SayHello( string  name)
        {
            Console.WriteLine(
" Hello , "   +  name) ;            
        }
        
        [AspectSwitcher(
typeof (PermissionAspectWrap) , true  ,Permission.Super)]     //调用此方法需要Permission.Super权限   
        
public   void  SayByebye( string  name)
        {
            Console.WriteLine(
" Byebye , "   +  name) ;
        }

        
    }

    
#region  PermissionAspectWrap
    
public   class  PermissionAspectWrap :IAspectProcessorWrap
    {
        
#region  IAspectProcessorWrap 成员

        
public  Type AspectProcessorType
        {
            
get
            {                
                
return   typeof (PermissionAspect);
            }
        }

        
public   object  AspectClassArgument
        {
            
get
            {
                
return   typeof (PermissionVerifier) ;
            }
        }

        
public  AspectSwitcherState DefaultAspectSwitcherState
        {
            
get
            {                
                
return  AspectSwitcherState.On ;
            }
        }
        
#endregion
    }

    
#endregion     

    
#region  PermissionVerifier ,Permission ,Logger
    
public   class  PermissionVerifier :IPermissionVerifier
    {
        
private   static   int  curPermission  =  Permission.Common ;

        
#region  IPermissionVerifier 成员

        
public   bool  QualifiedToOperation( object  permissionNeeded,  string  destClassFullName,  string  destMethodName)
        {
            
int  destPermission  =  ( int )permissionNeeded ;                
            
if (PermissionVerifier.curPermission  >  destPermission)
            {
                
return   true  ;
            }

            
return   false ;
        }

        
#endregion
    }

    
public   class  Permission
    {
        
public   const   int  Common  =   0  ;
        
public   const   int  Super   =   1  ;
    }    
    
#endregion

    由于当前用户级别为Permission.Common,所以在调用SayByebye的时候会抛出异常,而在调用SayHello的时候却可以正常进行。

 

 

目录
相关文章
|
6天前
|
存储 关系型数据库 分布式数据库
PostgreSQL 18 发布,快来 PolarDB 尝鲜!
PostgreSQL 18 发布,PolarDB for PostgreSQL 全面兼容。新版本支持异步I/O、UUIDv7、虚拟生成列、逻辑复制增强及OAuth认证,显著提升性能与安全。PolarDB-PG 18 支持存算分离架构,融合海量弹性存储与极致计算性能,搭配丰富插件生态,为企业提供高效、稳定、灵活的云数据库解决方案,助力企业数字化转型如虎添翼!
|
17天前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
1318 7
|
4天前
|
存储 人工智能 Java
AI 超级智能体全栈项目阶段二:Prompt 优化技巧与学术分析 AI 应用开发实现上下文联系多轮对话
本文讲解 Prompt 基本概念与 10 个优化技巧,结合学术分析 AI 应用的需求分析、设计方案,介绍 Spring AI 中 ChatClient 及 Advisors 的使用。
291 128
AI 超级智能体全栈项目阶段二:Prompt 优化技巧与学术分析 AI 应用开发实现上下文联系多轮对话
|
3天前
|
监控 JavaScript Java
基于大模型技术的反欺诈知识问答系统
随着互联网与金融科技发展,网络欺诈频发,构建高效反欺诈平台成为迫切需求。本文基于Java、Vue.js、Spring Boot与MySQL技术,设计实现集欺诈识别、宣传教育、用户互动于一体的反欺诈系统,提升公众防范意识,助力企业合规与用户权益保护。
|
16天前
|
机器学习/深度学习 人工智能 前端开发
通义DeepResearch全面开源!同步分享可落地的高阶Agent构建方法论
通义研究团队开源发布通义 DeepResearch —— 首个在性能上可与 OpenAI DeepResearch 相媲美、并在多项权威基准测试中取得领先表现的全开源 Web Agent。
1383 87
|
3天前
|
JavaScript Java 大数据
基于JavaWeb的销售管理系统设计系统
本系统基于Java、MySQL、Spring Boot与Vue.js技术,构建高效、可扩展的销售管理平台,实现客户、订单、数据可视化等全流程自动化管理,提升企业运营效率与决策能力。
|
5天前
|
人工智能 Java API
AI 超级智能体全栈项目阶段一:AI大模型概述、选型、项目初始化以及基于阿里云灵积模型 Qwen-Plus实现模型接入四种方式(SDK/HTTP/SpringAI/langchain4j)
本文介绍AI大模型的核心概念、分类及开发者学习路径,重点讲解如何选择与接入大模型。项目基于Spring Boot,使用阿里云灵积模型(Qwen-Plus),对比SDK、HTTP、Spring AI和LangChain4j四种接入方式,助力开发者高效构建AI应用。
272 122
AI 超级智能体全栈项目阶段一:AI大模型概述、选型、项目初始化以及基于阿里云灵积模型 Qwen-Plus实现模型接入四种方式(SDK/HTTP/SpringAI/langchain4j)
|
5天前
|
弹性计算 安全 数据安全/隐私保护
2025年阿里云域名备案流程(新手图文详细流程)
本文图文详解阿里云账号注册、服务器租赁、域名购买及备案全流程,涵盖企业实名认证、信息模板创建、域名备案提交与管局审核等关键步骤,助您快速完成网站上线前的准备工作。
223 82
2025年阿里云域名备案流程(新手图文详细流程)