文档章节

web系统权限之数据权限

咖啡加糖
 咖啡加糖
发布于 2015/04/29 15:48
字数 2946
阅读 81
收藏 2
点赞 0
评论 0

转载地址:http://www.cnblogs.com/leoxie2011/archive/2012/03/20/2408542.html      

                              通用权限管理设计 之 数据权限

阅读目录

前言

 

前一篇文章《通用权限管理设计 之 数据库设计方案》介绍了【主体】- 【领域】 - 【权限】( who、what、how问题原型 ) 的设计思想

 

本文将对这种设计思想作进一步的扩展,介绍数据权限的设计方案。

权限控制可以理解,分为这几种 :

【功能权限】:能做什么的问题,如增加产品。
【数据权限】:能看到哪些数据的问题,如查看本人的所有订单。
【字段权限】:能看到哪些信息的问题,如供应商账户,看不到角色、 部门等信息。

上面提到的那种设计就是【功能权限】,这种设计有一定的局限性,对于主体,只能明确地指定。对于不明确的,在这里可能就没办法处理。比如下面这几种情况:

数据仅当前部门及上级可见
数据仅当前用户(本人)可见

类似这样的就需要用到上面提的数据权限。

上一篇文章我用一个表五个字段完成了【功能权限】的设计思路
本文我将介绍如何利用一个表两个字段完成这个【数据权限】的设计思路

初步分析

【数据权限】是在【功能权限】的基础上面进一步的扩展,比如可以查看订单属于【功能权限】的范围,但是可以查看哪些订单就是【数据权限】的工作了。

在设计中,我们规定好如果没有设置了数据权限规则,那么视为允许查看全部的数据。

几个概念
【资源】:数据权限的控制对象,业务系统中的各种资源。比如订单单据、销售单等。属于上面提到的【领域】中的一种
【主体】:用户、部门、角色等。
【条件规则】:用于检索数据的条件定义
【数据规则】:用于【数据权限】的条件规则 

 
应用场景
1,订单,可以由本人查看 
2,销售单,可以由本人或上级领导查看 
3,销售单,销售人员可以查看自己的,销售经理只查看 销售金额大于100,000的。

我们能想到直接的方法,在访问数据的入口加入SQL Where条件来实现,组织sql语句:

, UserID  {CurrentUserID}
, UserID  {CurrentUserID}   {CurrentUserID}  (领导)
, UserID  {CurrentUserID}   ({CurrentUserID}  (销售经理)   销售金额  )

这些一个一个的"条件",本文简单理解为一个【数据规则】,通常会与原来我们前台的业务过滤条件合并再检索出数据。

这是一种最直接的实现方式,在【资源】上面加一个【数据规则】(比如上面的三点)。这样设计就是

  【资源】 - 【数据规则】

我又觉得不同的人应该对应不同的规则,那么也可以理解为,一个用户对应不同的角色,每一个角色有不一样的【数据规则】,那么设计就变成

  【资源】 - 【主体】 - 【数据规则】

根据提供者的不同,准备不同的权限应对策略。

这里可以简单地介绍一下,这个方案至少需要2张表,一个是  【资源,主体,规则关系表】、一个是【数据规则表】

关系表不能直接保存角色,因为你不确定什么时候业务需要按照【部门】或者【分公司】来定义数据规则

于是可以用  Master、MasterKey  类似这样的两个字段来确定一个【主体】

用XML方式的话是这样配置的(放在数据库也类似):

复制代码

  
      销售员 = {CurrentUserID}
  
  
     销售金额 > 100000
  
  
    销售金额 > 100000  and 区域 = {当前用户所属区域}

复制代码

对于这种方式有兴趣的朋友也可以试一下,两种方式的【数据规则】是一样的,但是本文没有采用第二种设计方式,因为它多了一层处理逻辑,我以为应该设计越简单越好,就采用第一种方式:

  【资源】 - 【数据规则】

当然,上面是用SQL的方式来确定条件规则的,我们当然不会这么做。SQL虽然灵活,但是我们很难去维护,也不知道SQL在我们的界面UI上面如何体现。难不成直接用一个文本框来显示。这样对应一个开发人员来说不是问题,可是对应系统管理员,很容易出问题。所以我们需要有另一方式来确定这一规则,并最终可以转换成我们的SQL语句。

我们的设计关键在于如何规范好这些【数据规则】 ,这个规则必须是对前端友好的,而且是对后台友好的,JSON显然是很好的方式。

 规则说明:

1,数据权限规则总是:{属性 条件 允许值}

2,数据权限规则可以合并。比如 ( {当前用户 属于 销售人员} and {订单销售员 等于  当前用户} )   Or {当前用户  属于 销售经理}

3,最终我们会用JSON格式

在检索数据时会先判断有没有注册了某某【资源】的【条件规则】,如果有,那么加载这个【条件规则】并合并到我们前台的【搜索条件】(你的业务界面应该有一个搜索框吧)

 如下图定义了客户信息的搜索框,我们搜索客户ID包括AN,我们组织成的规则将会是:

{"rules":[{"field":"CustomerID","op":"like","value":"AN","type":"string"}],"op":"and"}

为了更好地理解【数据规则】,这里介绍一下【通用查询机制】 

【通用查询机制】

权限控制总离不开一些条件的限制(比如查看当前部门的单据),如果没有完善的通用查询规则机制,那么在做权限条件过滤的时候你会觉得很别扭。这里介绍一个通用查询方案,然后再介绍如何实现【数据规则】。

 

早些时候我写过一篇关于ligerGrid结合.net设计通用处理类的文章《 jQuery liger ui ligerGrid 打造通用的分页排序查询表格(提供下载) 》。里面提到的过滤信息是直接的SQL语句。这是不可靠,而且不安全的。
在前端传输给后台的过滤信息不应该是直接的SQL,而应该是一组过滤规则。在ligerui V1.1.8 已经加入了一个条件过滤器插件,这个插件组成的规则数据才是我受推荐的:
比如如下

 

{"rules":
[
{"field":"OrderDate","op":"less","value":"2012-01-01"},
{"field":"CustomerID","op":"equal","value":"VINET"}
]
,"op":"and"}

 

规则描述:
查找顾客VINET所有订单时间小于2011-01-01的单据


这样的数据是安全的,而且是通用的(你甚至可以再加一个OR子查询)。无论是在前端还是后台,无论你使用什么样的组件,都可以很好地利用。

通用后台的翻译,就可以生成这样SQL的参数:

 

复制代码

:
(      )
Parameters:
p1:
p2:VINET

复制代码

 

下面来点复杂的:查找 顾客VINET或者TOMSP,所有订单时间小于2011-01-01的单据

 

{
"rules":[{"field":"OrderDate","op":"less","value":"2012-01-01"}],
"groups":[
{"rules":[{"field":"CustomerID","op":"equal","value":"VINET"}, {"field":"CustomerID","op":"equal","value":"TOMSP"}],"op":"or"}
],
"op":"and"
}

 翻译结果:

 

复制代码

:(    (      ))
Parameters:
p1:
p2:VINET
p3:TOMSP

复制代码

 

这个过滤规则分为三个部分:【分组】、【规则】(字段、值、操作符)、【操作符】(and or),而自身就是一个分组。
这种简单的结构就可以满足全部的情况。

当然,上面提到的这些条件都是在前台定义(可能是用户在搜索框自己输入的)的,而在后台,我们可能会定义一下【隐藏条件】,比如说 【员工只能查看自己的】,要怎么做呢,其实很简单,只需要在后台接收到这个过滤条件(前台toJSON,后台解析JSON)以后,再加上一个过滤规则(隐藏条件):

 

{field:'EmployeeID',op:'equal',value:5}

 

可以将原来的过滤规则当做一个分组加入进行:

 

 

{op:'and',groups:[

 

{"rules":[{"field":"OrderDate","op":"less","value":"2012-01-01"}],
"groups":[
{"rules":[{"field":"CustomerID","op":"equal","value":"VINET"},{"field":"CustomerID","op":"equal","value":"TOMSP"}],"op":"or"}
],"op":"and"}

 

],rules:[{field:'EmployeeID',op:'equal',value:5}]
}


 

翻译如下:

 

复制代码

:
(    (    (      )))
Parameters:
p1:
p2:
p3:VINET
p4:TOMSP

复制代码



 这样的【条件规则】才是我们想要的,不仅在前端可以很好地解析,也可以在后台进行处理。在后台我们会定义跟这种数据结构对应的类,那么再定义一个翻译成SQL的类:


数据权限规则

说了这些,可以开始介绍如何实现【数据规则】了:

上面提到的【隐藏条件】,就是我介绍的【数据规则】
试想一些,这样 前台的过滤规则,再加上我们之间定义好的 【数据权限】控制 过滤条件。不就达到目的了吗。
先看看我们在数据库里保存的这些【数据规则】:

 看不明白?那来个清楚一点的:

规则描述

订单:【订单管理员和演示角色可以查看所有的】,【订单查看员】只能查看自己的

产品:【基础信息录入员和演示角色可以查看所有的】,【供应商】只能查看自己的

{CurrentEmployeeID}表示当前的员工。

实质上,我们还可以根据当前用户信息定义需要的参数,比如:

{CurrentUserID} 当前用户Id ,对应表【CF_User】

{CurrentRoleID} 当前角色Id ,对应表 【CF_Role】 

{CurrentDeptID} 当前用户部门Id,对应表【CF_Department】

{CurrentEmployeeID} 当前用户员工Id,对应表【Employees】(CF_User.EmployeeID)

{CurrentSupplierID} 当前用户供应商Id,对应表【Suppliers】(CF_User.SupplierID)

 在数据库中我们直接保存这些用户参数,在“翻译”规则成为SQL时,会替换掉:

比如查看订单,我们得到的SQL,可能是这样的:

复制代码

:        (     (       (    ((  (,))  (      )))   OrderID )  tmptableinner   OrderID )  tmptableouter   OrderID      
Parameters:

复制代码

{CurrentRuleID} 替换为 7

{CurrentEmployeeID} 替换为1

 下图是我们设计【数据权限】的界面,可以选择所有的字段,包括几个用户信息:

这些字段不仅仅只是在文本框中输入值,那么可以自定义数据来源:

 

复制代码

 fieldEditors  {};
fieldEditors  {
    : { type: , 
        options: {
            width: ,
            url: "..handler.ashx?OrdersidfieldShipCitytextfieldShipCitytrue"
        }
    }
};

复制代码

效果界面:

 


实际应用

既然是数据权限控制,如果有一个统一的数据接收入口,我们倒是可以利用这个入口做一些工作。

比如【ligerRM权限管理系统】统一使用 grid.ashx 这个数据处理程序作为列表数据的接收入口。

有了统一的接口,方便做权限的控制,使用过 ligerGrid Javascript表格,或者类似插件的朋友,应该比较清楚服务器的交互原理。 
在grid.ashx中,我们会通过 
【视图/表名 】、 【排序信息】、【分页信息】、【过滤信息】
这几个指标来获取指定的数据。


而在实际的业务中,可能会引入权限的控制。比如某某【资源】,只能由当前用户自身才能查看,或者只能由当前用户部门及上级部门才能查看。对于这些控制,我们采用对这些可能做权限控制的【资源】注册一组【条件规则】的方式来进行。

 我们将找到view定义好的【数据权限规则】,然后和用户在前台搜索框输入的【搜索规则】合并:

上面的代码就是数据条件合并的例子,这样便得到了我们最终需要的 过滤规则。



本文转载自:http://www.cnblogs.com/leoxie2011/archive/2012/03/20/2408542.html

共有 人打赏支持
咖啡加糖
粉丝 16
博文 20
码字总数 18836
作品 0
南京
程序员
简单权限系统设计(用户,角色,权限)

一,简单权限系统设计(用户,角色,权限) 表设计 用户表:tuser 角色表:trole 权限表:t_permission 关联表 用户角色关联表:tuserrole 角色权限关联表:trolepermisson 介绍: 根据用户查...

独钓渔 ⋅ 2016/09/29 ⋅ 0

浅谈服务器被黑后的检查工作流程

今天说说以入侵者的角度去谈谈服务器被干掉后,我们该做的哪些防护和检查工作,高手的话都比较熟悉系统加固和安全的问题,对于我等初学者来说,没有做过从事过安全方面工作,所以只能从入侵者...

Tar0 ⋅ 2013/12/09 ⋅ 0

web工作流管理系统开发之十二 同一张表单在流程多节点中流转的权限控件

以前写过一篇 表单权限与流程的权限控制;文章,没有具体的去实现,实践证明,同一张表单在多流程节点中流转,是工作流和电子表单必须要处理的问题。 工作流系统和电子表单相结合,达到同一张...

长平狐 ⋅ 2012/10/11 ⋅ 0

web工作流管理系统开发之五 开源osworkflow之用户系统改造

前言: osworkflow是个开源的工作流引擎,采用的是有限状态机的模型。内置有osuser这个用户系统,来处理用户权限相关的部分。但是功能很弱,只有用户表,用户组表,即简单的将用户划分给用户...

长平狐 ⋅ 2012/10/11 ⋅ 0

[Python学习] Django 权限控制

本文为大家讲解 Django 框架里自带的权限模型,从理论到实战演练,带领大家了解 Django 里权限是怎么一回事。 主要内容 什么是权限管理? Web 权限 Django 权限机制 Django 的权限项 权限应用...

xjtuhit ⋅ 2017/09/12 ⋅ 0

Winform开发框架之权限管理系统的改进

权限管理系统,一直是很多Mis系统和一些常见的管理系统所需要的,所以一般可以作为独立的模块进行开发,需要的时候进行整合即可,不需要每次从头开发,除非特殊的系统需求。我在Winform开发框...

walb呀 ⋅ 2017/12/04 ⋅ 0

实现RTSP网站微信直播方案EasyNVR(linux版)部署问题之:ERR_CONTENT_LENGTH_MISMATCH

发现问题: 想要优化一下EasyNVR相关功能,内部测试软件,于是在linux系统中部署了一台EasyNVR。当部署好,运行起来发现问题: EasyNVR的配置页面数据出不来。 分析问题: 基于是web页面出现...

xiejiashu ⋅ 2017/11/28 ⋅ 0

如何在应用系统中实现数据权限的控制功能

在很多应用行业里面,都对数据的权限做了特别的声明,如对于销售,财务的数据,它们是非常敏感的,因此要求对数据权限进行控制,对于基于集团性的应用系统而言,就更多需要控制好各自公司的数...

walb呀 ⋅ 2017/12/04 ⋅ 0

分布式架构平台的介绍

项目核心代码结构截图 jeesz-utils jeesz-config jeesz-framework jeesz-core-cms jeesz-core-gen jeesz-core-bookmark jeesz-core-act jeesz-core-oa jeesz-core-test jeesz-core-scheduler......

我就看看ni ⋅ 2017/06/13 ⋅ 0

Web自定义表单工具和协同办公系统之集成(1)

提起“协同办公”,随便在百度或者Google搜索一下,就能让你看到眼花缭乱的信息,国内的各大协同办公软件厂商都在鼓吹着自己对协同的理解和自己的协同办公软件产品如何能实现协同办公管理,但...

长平狐 ⋅ 2012/10/11 ⋅ 1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

CENTOS7防火墙命令记录

安装Firewall命令: yum install firewalld firewalld-config Firewall开启常见端口命令: firewall-cmd --zone=public --add-port=80/tcp --permanent firewall-cmd --zone=public --add-po......

cavion ⋅ 58分钟前 ⋅ 0

【C++】【STL】利用chromo来测量程序运行时间与日志时间打印精确到微秒

直接上代码吧,没啥好说的。头疼。 #include <iostream>#include <string>#include <ctime>#include <sstream>#include <iomanip>#include <thread>#include <chrono>using ......

muqiusangyang ⋅ 今天 ⋅ 0

Mac环境下svn的使用

在Windows环境中,我们一般使用TortoiseSVN来搭建svn环境。在Mac环境下,由于Mac自带了svn的服务器端和客户端功能,所以我们可以在不装任何第三方软件的前提下使用svn功能,不过还需做一下简...

故久呵呵 ⋅ 今天 ⋅ 0

破解公司回应苹果“USB限制模式”:已攻破

本周四,苹果发表声明称 iOS 中加入了一项名为“USB 限制模式”的功能,可以防止 iPhone 在连接其他设备的时候被破解,并且强调这一功能并不是针对 FBI 等执法部门,为的是保护用户数据安全。...

六库科技 ⋅ 今天 ⋅ 0

MyBtais整合Spring Boot整合,TypeHandler对枚举类(enum)处理

概要 问题描述 我想用枚举类来表示用户当前状态,枚举类由 code 和 msg 组成,但我只想把 code 保存到数据库,查询处理,能知道用户当前状态,这应该怎么做呢?在 Spring 整合MyBatis 的时候...

Wenyi_Feng ⋅ 今天 ⋅ 0

synchronized与Lock的区别

# <center>王梦龙的读书笔记第一篇</center> ## <center>-synchronized与Lock的区别</centre> ###一、从使用场景来说 + synchronized 是能够注释代码块、类、方法但是它的加锁是和解锁使用一......

我不想加班 ⋅ 今天 ⋅ 0

VConsole的使用

手机端控制台打印输出,方便bug的排查。 首先需要引入vconsole.min.js 文件,然后在文件中创造实例。就能直接使用了。 var vConsole = new VConsole(); vConsole的文件地址...

大美琴 ⋅ 今天 ⋅ 0

Java NIO之字符集

1 字符集和编解码的概念 首先,解释一下什么是字符集。顾名思义,就是字符的集合。它的初衷是把现实世界的符号映射为计算机可以理解的字节。比如我创造一个字符集,叫做sex字符集,就包含两个...

士别三日 ⋅ 今天 ⋅ 0

Spring Bean基础

1、Bean之间引用 <!--如果Bean配置在同一个XML文件中,使用local引用--><ref bean="someBean"/><!--如果Bean配置在不同的XML文件中,使用ref引用--><ref local="someBean"/> 其实两种......

霍淇滨 ⋅ 今天 ⋅ 0

05、基于Consul+Upsync+Nginx实现动态负载均衡

1、Consul环境搭建 下载consul_0.7.5_linux_amd64.zip到/usr/local/src目录 cd /usr/local/srcwget https://releases.hashicorp.com/consul/0.7.5/consul_0.7.5_linux_amd64.zip 解压consu......

北岩 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部