第四章
细粒度数据查询权限
(上)
通过基于角色访问控制,我们可以控制哪些人具有某种权限。比如总公司员工柴其贵、分公司员工李朵朵和营业部员工贾志宏,三个人都具有访问“查询员工”页面权限。
但,由于他们三人所在公司级别不同(总公司、分公司和营业部),进入查询员工页面,系统展示出来的员工数据应该是不同的。
此类数据查询权限,在业务系统里面随处可见。毕竟
N
多操作,都起源于查询。连增加数据操作都有,比如增加表单的某个下拉框内容,可能来自数据库查询。
数据查询权限,包括
2
个纬度:行级和列级。
现有方案
常见拼凑
SQL
常见做法是,采用
if
else
做判断,决定执行那条程序分支,也就是
SQL
。
String sql=””;
if( user.getCompanyLevel()==Constants.总公司 ) {
sql=”select * from demouser u, company c where u.companyId=c.id”; //查询所有员工
} else if( user.getCompanyLevel()==Constants.分公司 ) {
String currentUserCompanyId=user.getCompanyId();
sql=” select * from demouser u, company c where u.companyId=c.id and c.id”= currentUserCompanyId + “ or c.pid=”+currentUserCompanyId; //查询本分公司及下属营业部员工
} else if( user.getCompanyLevel()==Constants.营业部 ) {
String currentUserCompanyId=user.getCompanyId();
sql=” select * from demouser u, company c where u.companyId=c.id and c.id”= currentUserCompanyId; //查询本营业部员工
}
// 执行数据库查询,并将结果封装为JAVA对象
变通方法
也有不少开发者对上述方法做了改进,我了解到如下改进方法:
1.
采用
AOP
技术,向
find/select
模型注入
where
条件;
2.
将
SQL
语句全部提取出来,集中保存在某个
SQL
配置文件里面,类似
HIBERNATE
那样。
上述方法,都不能减少
if
else
判断,只是把
SQL
语句做了转移。
AOP
注入方式,将
if else
判断从模型层转移到注入层。集中提取
SQL
方式,只是将
SQL
转移到统一的保存文件,
if else
依然转移不掉。
关于列级控制、分页查询和自定义条件查询,那就更麻烦了,在此不做叙述。
如果使用
Metadmin
在设计
Metadmin
之初,我们确定了这些目标:
1.
将行列级授权逻辑、
if else
判断全部从业务代码中剥离出去,达到权限与业务完全解开耦合;
2.
提供
API
供业务方法调用,通过该方法获取该用户具有权限查询的数据;
3.
整个过程不要编码,也不要
XML
,通过界面设计出来,并且每个查询逻辑设计完毕,可以立即在线测试,保证查询逻辑无误。
为此,
Metadmin
提供如下服务:
1.
Metadmin
提供数据查询
API
:告诉
metadmin
,当前是谁想要查什么数据,
metadmin
就能返回该用户具有权限查询的数据;
2.
Metadmin
提供的
API
支持分页和自定义条件查询,当然这一切都是在该用户的授权范围内;
3.
权限设计器,通过设计器展现出业务数据库表,运用鼠标拖拽等操作把查询逻辑设计出来,并可以在线测试;
4.
支持复杂、特定数据库逻辑手工输入
SQL
,调优性能。
以下演示来自
metadmin
下载包里面包含的演示示例,可以在
www.metadmin.com
下载
Metadmin
安装程序包。
API
MetadminService
类:
static QueryResult
|
query
(int privilegeId, User
user,
java.util.Map context)
评估查询授权策略,返回查询结果。
|
static QueryResult
|
query
(int privilegeId, User
user,
java.util.Map context, CustomizedWhere
where)
评估查询授权策略,返回查询结果。
|
static QueryResult
|
query
(int privilegeId, User
user,
java.util.Map context, CustomizedWhere
where,
int first, int max)
评估查询授权策略,返回查询结果,支持分页。
|
static QueryResult
|
query
(int privilegeId, User
user,
java.util.Map context, int first, int max)
评估查询授权策略,返回查询结果,支持分页。
|
static int
|
queryCount
(int privilegeId, User
user,
java.util.Map context)
评估查询授权策略,返回匹配记录的个数。
|
static int
|
queryCount
(int privilegeId, User
user,
java.util.Map context, CustomizedWhere
where)
评估查询授权策略,返回匹配记录的个数。
|
WebMetadminService
类,为
WEB
程序定制的类,从
HttpRequest
自动读取当前用户:
static java.util.Collection
|
query
(HttpServletRequest req, int privilegeId)
评估查询授权策略,返回查询结果。
|
static java.util.Collection
|
query
(HttpServletRequest req,
int privilegeId, CustomizedWhere
where)
评估查询授权策略,返回查询结果,支持分页。
|
static java.util.Collection
|
query
(HttpServletRequest req,
int privilegeId, CustomizedWhere
where,
int first, int max)
评估查询授权策略,返回查询结果,支持分页。
|
static java.util.Collection
|
query
(HttpServletRequest req, int privilegeId,
int first, int max)
评估查询授权策略,返回查询结果,支持分页。
|
static java.util.Collection
|
query
(HttpServletRequest req, int privilegeId,
java.util.Map context)
评估查询授权策略,返回查询结果,支持分页。
|
static java.util.Collection
|
query
(HttpServletRequest req, int privilegeId,
java.util.Map context,CustomizedWhere
where)
评估查询授权策略,返回查询结果。
|
static java.util.Collection
|
query
(HttpServletRequest req, int privilegeId,
java.util.Map context,CustomizedWhere
where,
int first, int max)
评估查询授权策略,返回查询结果,支持分页。
|
static java.util.Collection
|
query
(HttpServletRequest req, int privilegeId,
java.util.Map context, int first, int max)
评估查询授权策略,返回查询结果,支持分页。
|
static int
|
queryCount
(HttpServletRequest req,
int privilegeId)
评估查询授权策略,返回匹配记录的个数。
|
static int
|
queryCount
(HttpServletRequest req,
int privilegeId, CustomizedWhere
where)
评估查询授权策略,返回匹配记录的个数。
|
static int
|
queryCount
(HttpServletRequest req, int privilegeId,
java.util.Map context)
评估查询授权策略,返回匹配记录的个数。
|
static int
|
queryCount
(HttpServletRequest req, int privilegeId,
java.util.Map context,CustomizedWhere
where)
评估查询授权策略,返回匹配记录的个数。
|
业务数据库
第一章讲解了
Metadmin
对于数据库的分类:权限数据和业务数据,两者保存在不同
schema
里面。
WEB-INF/metadmin/datasources.xml
:
<?xml version="1.0"?>
<datasources>
<datasource name="metadmin" configFile="metadmin.properties"/>
<datasource name="mydemo" configFile="mysql.properties" schemas="mydemo, metadmin"/>
</datasources>
name=”mydemo”
的数据源表示业务数据源,具体配置信息在
mysql.properties
文件里面,打开设计器时,只展示该数据库的
mydemo
和
metadmin
两个
schema
数据库表和视图。
具体数据源配置信息,参阅:
http://www.metadmin.com/doc/main.html#数据源
2.6
数据查询设计器
在打开数据查收设计器之前,开发者先准备好
JavaBean
,也就是打开把查询出来的数据保存到哪个
Java
值对象。演示程序提供了
Employee
,将查询出来的数据保存到该
JavaBean
里面。
Employee.java
package org.back.demo;
import java.util.Date;
public class Employee {
private int id;
private int companyId;
private int departmentId;
private String loginName;
private String name;
private String password;
private String companyName;
private String departmentName;
private int isManager;
private Date hireDate;
// … get/set methods…
}
启动
web
服务器,在浏览器输入:
http://localhost:8080/mydemo/metadmin/designer
(假定您发布的
web
context
是
mydemo
,且服务器端口是
8080
)
打开左边条形框里面的“数据查询”,在树上右击,选择“新增数据查询”。如图示:

在弹出的框里面输入相关信息,如图示:

我们先新建总公司用户查看数据的
SQL
,分公司和营业部用户查询
SQL
以及怎样与业务系统集成,由于篇幅关系,下章讲述。
在数据查询树上,单击“查询所有员工”,系统自动展现数据查询设计器。
然后按照如下步骤操作:
1.
展开
mydemo schema
,展开表;
2.
双击
company, department, demouser
表,因为要查询这三张表;
3.
勾选
company
表
name
字段,
department
表
name
字段,勾选
demouser
表所有字段;
4.
在映射类里面,输入
org.back.demo.Employee
;
5.
检查下面的字段映射是否有误,修改
company
表的
name
映射属性为
companyName
,修改
department
表的
name
映射属性为
departmentName
。
如图示:

到此,设计还差一个步骤,设置
where
条件。本查询
where
条件是
3
张表关联。
按照如下步骤操作:
1.
点击设计器下方的“
WHERE
”标签页
2.
右击条件组,选择“新增二元条件”;
3.
点击第一个字段节点,在右边选择“
company.id
”也就是
company
表的
id
字段;
4.
然后,设置第二个字段为“
demouser.companyId
”字段;
5.
右击条件组,选择“新增二元条件”;
6.
将第一个字段选择为“
department.id
”,第二个字段选择为“
demouser.departmentId
”。
至此,三表关联完毕。也就是完成
SQL
:
company.id=demouser.companyId and department.id=demouser.departmentId
。
如图示:

现在,我们可以测试了!选择设计器下方“测试”标签页,点击控制台执行小图标。
Metadmin
将显示该
sql
语句能查询的数据,行列级!
如图示:

至此,我们完全放心该
SQL
语句没有任何问题。点击“保存”图标,保存设计结果。
下章,讲解其他
SQL
还有怎样与业务系统集成。
分享到:
相关推荐
在Java开发中,细粒度权限管理是一种重要的安全机制,它允许系统对用户访问资源进行精确控制,确保每个用户只能操作他们被授权的部分。Shiro是Apache组织提供的一款强大且易用的Java安全框架,它提供了身份认证、...
总之,基于RBAC的细粒度权限控制提供了一种有效且灵活的方式来管理Web应用的访问权限。它通过角色将用户和权限关联,减少了管理开销,增强了系统的安全性和适应性。随着企业需求的不断变化,RBAC模型已成为现代权限...
知识点四:实现细粒度权限管理系统的技术方法 为了实现细粒度的权限管理,研究者们通常需要开发一系列机制和工具来辅助权限的分析和控制。这些工具可能包括权限检测器,它能够分析应用程序请求的权限并检测潜在的...
共包含6大类20个细粒度要素的情感倾向.数据集分为训练、验证、测试A与测试B四部分。数据集中的评价对象按照粒度不同划分为两个层次,层次一为粗粒度...每个细粒度要素的情感倾向有四种状态:正向、中性、负向、未提及.
在信息系统中,细粒度权限管理(Fine-Grained Access Control, FGAC)是一种重要的安全策略,它允许系统管理员对用户访问资源的权限进行精确控制。这种方法与传统的粗粒度权限管理不同,后者通常只设置如“读取”、...
基于SpringBoot+shiro实现数据库的细粒度动态权限管理系统 项目经过严格测试,确保可以运行!源码无需做任何更改! 基于SpringBoot+shiro实现数据库的细粒度动态权限管理系统 项目经过严格测试,确保可以运行!...
这表明,该细粒度权限管理机制能够在一定程度上有效识别恶意软件,同时减少了误报,提高了用户对权限控制的满意度。 通过这种方式,Android平台的安全性得到了显著提升,用户可以更加自信地管理他们的应用程序,...
本次比赛我们提供了一个高质量的海量数据集,共包含6大类20个细粒度要素的情感倾向。参赛人员需根据标注的细粒度要素的情感倾向建立算法,对用户评论进行情感挖掘,组委将通过计算参赛者提交预测值和场景真实值之间...
细粒度权限管理是数据级别的权限管理,例如部门经理可以访问本部门的员工信息,用户只可以看到自己的菜单,大区经理只能查看本辖区的销售订单。 在实现粗粒度权限管理时,可以将权限管理的代码抽取出来在系统架构...
《细粒度情感方面情感数据集:深度剖析与应用》 在当今的信息化社会,情感分析已经成为数据分析领域的重要分支,特别是在互联网评论、社交媒体等大数据环境中,用户的情感倾向往往能反映出产品或服务的真实口碑。本...
CP-ABE技术允许用户根据自己的权限访问加密数据,实现细粒度的访问控制。同时,通过转换键和代理重加密技术,大部分计算任务被转移到云服务器,减轻了移动设备的计算负担,减少了资源消耗。这意味着移动设备用户可以...
7. **细粒度权限控制**:AppBoxPro强调细粒度权限管理,意味着不仅控制到用户和角色级别,还可以深入到具体的功能和数据记录层面,确保了权限分配的灵活性和安全性。 8. **源码分析**:拥有AppBoxPro的源码,开发者...
这是一个基于Spring Security框架的细粒度权限管理系统,使用Java语言开发,同时包含JavaScript、CSS、HTML等多种编程语言。该项目共包含2447个文件,其中主要文件类型包括JavaScript、PNG图片、CSS、HTML、JAR包、...
项目包含:100类大型细粒度飞机图像检测数据集(yolo标注格式),数据保存按照文件夹保存,经测试,可直接用作目标检测数据集,无需额外处理。 用于细粒度图像检测任务,FGVC数据 【数据总大小】341 MB 【数据集...
本次比赛我们提供了一个高质量的海量数据集,共包含6大类20个细粒度要素的情感倾向。参赛人员需根据标注的细粒度要素的情感倾向建立算法,对用户评论进行情感挖掘,组委将通过计算参赛者提交预测值和场景真实值之间...
在细粒度权限管理中,我们可以在方法上添加自定义的权限注解,比如`@PermissionRequired`,表示调用此方法需要特定的权限。这样,当通过动态代理调用这个方法时,我们可以在invoke方法内检查目标方法上的注解,判断...
细粒度权限管理是一种先进的策略,它允许管理员对用户访问系统资源的权限进行更精确的控制,而不是简单的“允许”或“禁止”。本资源通过动态代理和注解技术实现了一种细粒度的权限管理方案,具体到每个方法的级别,...
### 细粒度权限管理与Root能力的分发和管理 #### 实验背景与目标 在计算机系统安全领域,权限管理是一项重要的技术措施,用于控制用户对于系统资源的访问级别。其中,细粒度权限管理和root能力的有效管理是确保...