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

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

时间:2023-03-24 16:46:33浏览次数:43  
标签:set C# AOP nvarchar -- optype SQL 权限 declare

背景:

 

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

 

效果:

 

 

 

后台日志

 

 

 

收工。

 

标签:set,C#,AOP,nvarchar,--,optype,SQL,权限,declare
From: https://www.cnblogs.com/hztech/p/17252527.html

相关文章

  • 假冒的ChatGPT浏览器扩展被发现劫持Facebook账户
    谷歌已介入从官方网上商店中删除伪装成OpenAI的ChatGPT服务的虚假Chrome浏览器扩展程序,以获取Facebook会话cookie并劫持帐户。“ChatGPTForGoogle”扩展程......
  • 靶机练习8: decoy
    靶机地址https://www.vulnhub.com/entry/sunset-decoy,505/信息收集全端口扫描发现服务,并扫描其版本sudomasscan-p1-65535,U:1-65535172.16.33.40--rate=5000-et......
  • session和cookie的作用原理和区别
    session和cookie的作用原理和区别session和cookie简述session一、session的概念及特点二、为什么要使用session三、session的工作原理四、session与cookies区别五......
  • Element UI布局容器中<el-container>的一个问题
    <el-container>:外层容器。当子元素中包含 <el-header> 或 <el- footer> 时,全部子元素会垂直上下排列,否则会水平左右排列。所以需要一个<el-header>或<el-footer>......
  • (转)Beego脱坑(九)Cookie和Session
    原文:https://blog.csdn.net/yang731227/article/details/82263125title:Beego脱坑(九)Cookie和Sessiontags:go,beegoauthor:Clown95 Cookie1.Http是无状态的协议,服务......
  • mysql8免安装版安装教程
    windows安装mysql8免安装版教程,附网盘资源目录windows安装mysql8免安装版教程,附网盘资源一、前言二、安装配置流程2.1、下载并解压2.2、设置Mysql配置文件2.3、初始化mys......
  • Winform中通过自带的App.config实现从配置文件中读取配置
    场景Winform中实现保存配置到文件/项目启动时从文件中读取配置(序列化与反序列化对象):https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/129614129在上面通......
  • Charles 使用手册
    抓取PC端请求HTTP请求默认抓取pc端http请求(可在Proxy-WindowsProxy勾选抓取/不勾选不抓取)HTTPS请求选择Help->SSLProxying->InstallCharlesRootCertifi......
  • 一文详解vue-cli2.0与vue-cli3.0之间的区别
    我们之所以介绍vue-cli2和vue-cli3的使用和区别,是因为VUE脚手架工具从vue-cli3版本开始,在项目结构等诸多方面开始与vue-cli2版本相比,有较大的优化与调整。因此,在学习和工......
  • java mysql+sqlite普通查询
    importjava.sql.*;publicclassTest{publicstaticvoidmain(String[]args){try{//newTest().queryMySql();newTest......