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