• C# +SQL 存储过程 实现系统数据权限审查AOP效果


    背景:

     

      1、C/S系统架构

      2、前端 Extjs 

      3、后台C#

      4、数据库SQL

    前端通过ajAx请求与后台通信。

    前端应用页面统一继承入口类  BasePage

     

    应用页面

    public partial class xxxxxxx :BasePage 
     {
    
        //y业务代码......
    }

     

    BasePage

    public class BasePage : System.Web.UI.Page
    {
         //在这里实现数据权限核查  

    }

     

     

    需求:

    完成数据操作权限核查,并提醒前端

    分析:

    因为所有页面都继承了 BasePage 所以,现可以BasePage中加入代码。后台功能实现,因为要根据当前用户的ID 和所请求页面进行权限判断。

    为提高效率可以存储过程中完成判断,并返回结果。

    另外为便于管理和跟踪,判断结束后记录日志

     

    存储过程

    复制代码
     
    -- =============================================
    -- Author:        张立辉
    -- Create date: 2023-3-24
    -- Description:     系统权限控制 AOP
    -- =============================================
    create PROCEDURE [dbo].[Hztech_Aop] 
        @userID     as nvarchar(20),
        @URI as nvarchar(200),
        
        @result as nvarchar(20) output,
        @msg as nvarchar(200) output
        
         
    AS
    BEGIN
    declare @roleid as int --角色ID
    declare @location as int-- DataStore/ 的位置
    declare @moduleAndPage as nvarchar(200)--模块/页面及请求参数
    declare @module as nvarchar(50) --模块
    declare @pageAndOptype as nvarchar(100)-- page
    declare @page as nvarchar(100)-- page
    declare @optype as nvarchar(50) --optype
    
    
    declare @Edit   as bit
    declare  @Del   as bit
    declare    @Close  as bit
    declare   @Lock   as bit
    declare   @Unop as bit
    declare   @Export as bit
    declare @pageName as nvarchar(100)
    declare @pass nvarchar(20)    
    set @pass='refuse'
    
    set @pageName='查询'
    --1 通过用户id 获取角色 id
        select @roleid=isnull(roleid,0) from [xxxx_UserRoles] where UserID=@userID
        if(@roleid is null or @roleid=0)
        begin
            set @pass='refuse'
            set @msg='您未被授权进行任何操作。'
            set @result= 0
            goto logg
        end
    --2 通过url 和 和角色ID 获取菜单权限
        --2.1 判断是否为 datastore请求
        set @location=charindex('xxxxxxxxxx/',@URI,0)
        if(@location<=0)
        begin
            set @msg='pass+log,非xxxxxxxxxx操作。'
            set @result= 1
            goto logg
        end
        --2.2 包含 DataStore/
        set   @moduleAndPage= SUBSTRING(@URI,@location+len('xxxxxxxxxxxx/'),len(@URI)-4)
        --解析URL 
        set @module=dbo.GetSplitOfIndex(@moduleAndPage,'/',1)--模块
        set @pageAndOptype=dbo.GetSplitOfIndex(@moduleAndPage,'/',2)--@pageAndOptype
        set @page=dbo.GetSplitOfIndex(@pageAndOptype,'?',1) --yyy.aspx?optype=xxxx
        set @optype=dbo.GetSplitOfIndex(@pageAndOptype,'?',2)-- optype=xxxx
        set @optype=dbo.GetSplitOfIndex(@optype,'=',2) -- xxxx   或者 xxxx&p=v
        if(CHARINDEX('&',@optype,0)>0) --包含多个参数
        begin
            set @optype=dbo.GetSplitOfIndex(@optype,'&',1) -- xxxx
        end
        
     
    --3 判断是否需要控制权限
        /* optype  值范围
        
            *Submit --dialog  单表提交
            savePOBill  单据保存
          。。。。。。。
    
        */
        --3.1 查询操作
         if(@optype='getPobillAndDetail' or @optype='showfile' or charindex('Select',@optype,0)>0
         or @optype='WorkFlowApprovePobill' --审批提交
         )
            begin
                set @pass='log'
                set @msg='pass,非修改操作。'
                set @result= 1
                goto logg
            end
        --3.2 获取权限
          select  @Edit=[CanEdit]
           --其它权限省略
          from [permissionView] 
          where [Url] like '%/'+@module+'/%' and roleid=@roleid
    
        
    --4 判断是否有 权限
        if    (charindex('Submit',@optype,0)>0--dialog  单表提交
            or @optype='savePOBill' --单据保存
             
            )
            begin---编辑权限
                if(@Edit=1)--可编辑
                    begin
                        set @result= 1
                 
                    end
                else
                begin
                    set @result=0
                     goto logg
                end
            end  
          ---其它权限核查 略
        。。。。。。。。。。
    else set @result=0-- 其它情况 拒绝 refuse if(@result=1) set @pass='pass' --5 记录日志 logg: if(@result=0) set @msg='未授权进行当前操作'+@optype insert into sys_aoplog([code] ,[name] ,[uri] ,[verifyresult], module,[page],optype,remark) values (@userID,@pageName,@URI,@pass,@module,@page,@optype,@msg) --6 返回结果 return @result END
    复制代码

     

    前端调用存储过程进行鉴权

    复制代码
      //判断权限
                       bool purCheck= dataOperate.ExeAopProc(aurl, currentUser.UserID.ToString(), out purMsg);
                       if (!purCheck)
                       {
                           string jsonlist1 = Common.ExtAjaxRequest.GetOperateRet("0", purCheck, purMsg);
                           Response.Write(jsonlist1);
                           Response.End();
                       }
    复制代码

     

    效果:

     

     

     

    后台日志

     

     

     

    收工。

     

  • 相关阅读:
    商业合作保密协议书(公对公)【设计】
    测开不得不会的python之re模块正则表达式匹配
    一文详解:什么是进销存管理系统?2023年top10进销存管理系统大推荐!
    58.鸿蒙系统app(HarmonyOS)(ArkUI)更改应用程序图标
    day30 SQL注入&CTF&二次&堆叠&DNS带外
    RT-Thread移植到STM32单片机过程
    基于ssm的停车场管理系统
    「Redis数据结构」压缩列表(ZipList)
    Linux学习-60-date、tr命令
    滑动窗口的最大值(双端队列,单调队列)
  • 原文地址:https://www.cnblogs.com/hztech/p/17252527.html