背景:

  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]
,@Del=[CanDel]
,@Export=[CanExport]
,@Close=[CanClose]
,@Lock=[CanLock]
,@Unop=[UnOperate] ,@pageName=[text]
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();
}

效果:

后台日志

收工。

C# +SQL 存储过程 实现系统数据权限审查AOP效果的更多相关文章

  1. SQL Server 2005 系统数据介绍:dm_exec_connections

    原文:SQL Server 2005 系统数据介绍:dm_exec_connections 转载:http://msdn.microsoft.com/zh-cn/library/ms181509(SQ ...

  2. C#.NET 大型通用信息化系统集成快速开发平台 4.0 版本 - 省市区数据权限的实现效果

    折腾了2-3周,终于把全国网点数据权限,省.市.县数据规范化,查询权限规范化,基础数据规范化的思路理清楚了, 今天应该是一个里程碑式的一天 省市区数据规范化后 1:网点的基础数据可以更加严谨规范化. ...

  3. sql 存储过程导出指定数据到.txt文件(定时)

    需求:每天生成一份txt文件数据,供第三方通过http方式调用 方法: 1.新建存储过程: USE [LocojoyMicroMessage] GO /****** Object: StoredPro ...

  4. SQL存储过程动态查询数据区间

    以前经常看到人查询数据库采用left join及case方式,一条一条的枚举查询整个数据的数据区间方法可行,但是数据一但很大,枚举就死悄悄,在网上查看,几乎全是照抄case ,left join枚举无 ...

  5. JAVA 数据权限设计

    数据权限设计 前言 在各种系统中.要保证数据对象的安全性以及易操作性,使企业的各业务部门.职能部门可以方便并且高效的协同工作,那么一个好的数据权限管理设计就成为一个关键的问题.尽管企业中各个单元的工作 ...

  6. SpringCloud微服务实战——搭建企业级开发框架(二十八):扩展MybatisPlus插件DataPermissionInterceptor实现数据权限控制

    一套完整的系统权限需要支持功能权限和数据权限,前面介绍了系统通过RBAC的权限模型来实现功能的权限控制,这里我们来介绍,通过扩展Mybatis-Plus的插件DataPermissionInterce ...

  7. SQL使用数据库引擎存储过程,系统视图查询,DBA,BI开发人员必备基础知识

    在开发过程中会遇到需要弄清楚这个数据库什么时候建的,这个数据库中有多少表,这个存储过程长的什么样子等等信息,今天把自己工作过程中经常用到的一些数据库引擎存储过程,系统视图等等总结一下以备不时之用.下面 ...

  8. Sql Server 存储过程中查询数据无法使用 Union(All)

    原文:Sql Server 存储过程中查询数据无法使用 Union(All) 微软Sql Server数据库中,书写存储过程时,关于查询数据,无法使用Union(All)关联多个查询. 1.先看一段正 ...

  9. SQL点滴17—使用数据库引擎存储过程,系统视图查询,DBA,BI开发人员必备基础知识

    原文:SQL点滴17-使用数据库引擎存储过程,系统视图查询,DBA,BI开发人员必备基础知识 在开发过程中会遇到需要弄清楚这个数据库什么时候建的,这个数据库中有多少表,这个存储过程长的什么样子等等信息 ...

  10. 最通用的ibatis.Net使用sql server存储过程返回分页数据的详细例子

    ibatis.Net是一个比较简单和灵活的ORM框架,今天我分享一个我的项目中使用sql server通用存储过程来分页的一个例子,用ibatis.Net框架统一返回分页数据为IList<Has ...

随机推荐

  1. 第三课 Hello World显示

    HelloWorld 1.新建文件件 2.新建java文件 3.编写代码 public class Hello{ public static void main(String[] args){ Sys ...

  2. Java面向对象编程:多态(自我理解)

    多态 (1)概念:同一个行为具有多个不同表现形式或形态的能力:就是同一个接口,使用不同的实例而执行不同的操作. (2)优点:消除类型之间的耦合关系:可替换性:可扩充性:接口性:灵活性:简化性: (3) ...

  3. xmake构建C/C++编译环境

    1. xmake介绍 XMake是一个基于Lua的轻量级跨平台自动构建工具,支持在各种主流平台上构建项目 xmake的目标是开发者更加关注于项目本身开发,简化项目的描述和构建,并且提供平台无关性,使得 ...

  4. 【python基础笔记-3】decimal模块解决浮点数计算精度问题

    通过Decimal('123.456')对象实例化后做 + - * / 等运算符操作计算结果不会出现精度问题. Tips:值得注意的2点是 1.Decimal接收的入参是str,所以如果原本操作的数据 ...

  5. python基于word模板批量生成word文件

    1.需要用到docxtpl库,用于操作word模板 安装:pip insatll docxtpl 处理之前的word模板 处理后的word 下面直接上代码揭开它的神秘面纱:第一步,读取excel中的内 ...

  6. Mysql explain 每个属性含义

    Mysql explain explain 常用于分析sql语句的执行效率,使用时在正常的select语句之前添加explain并执行就会返回执行信息,返回的执行信息如下:  id:id列的编号是se ...

  7. js数组原型方法

    今天学习了一下js数组原型的操作方法,小结一下学习地址https://www.cnblogs.com/obel/p/7016414.html 1.join() join(separator): 将数组 ...

  8. VUE相关面试题目01

    一.MVVM是什么;      MVC:      MVVM的描述:           常见库实现数据双向绑定的效果:                     发布订阅模式;            ...

  9. 转载·Pycharm Pro“This license 56ZS5PQ1RF has been cancelled” 激活码失效处理记录

    今天打开许久没用的Pycharm提示激活码过期,激活提示:"This license 56ZS5PQ1RF has been cancelled" 解决方法如下 首先修改hosts ...

  10. axel多线程下载

    Axel 是一个轻量级下载程序,它和其他加速器一样,对同一个文件建立多个连接,每个连接下载单独的文件片段以更快地完成下载. Axel 通过打开多个 HTTP/FTP 连接来将一个文件进行分段下载,从而 ...