背景:

1、C/S系统架构

2、前端 Extjs

3、后台C#

4、数据库SQL

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

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

应用页面

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

BasePage

public classBasePage : 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) outputAS
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
        gotologgend
--2 通过url 和 和角色ID 获取菜单权限
    --2.1 判断是否为 datastore请求
    set @location=charindex('xxxxxxxxxx/',@URI,0)if(@location<=0)begin
        set @msg='pass+log,非xxxxxxxxxx操作。'
        set @result= 1
        gotologgend
    --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 gotologgend --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 gotologgend 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(), outpurMsg);if (!purCheck)
{
string jsonlist1 = Common.ExtAjaxRequest.GetOperateRet("0", purCheck, purMsg);
Response.Write(jsonlist1);
Response.End();
}

效果:

后台日志

收工。

标签: none

添加新评论