C# +SQL 儲存過程 實現系統資料許可權審查AOP效果

2023-03-24 18:00:54

背景:

 

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

 

效果:

 

 

 

後臺紀錄檔

 

 

 

收工。