`
metadmin
  • 浏览: 168369 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

《玩转细粒度权限管理》 四,细粒度数据查询权限(上)

阅读更多

 

第四章

细粒度数据查询权限

(上)

 

 

通过基于角色访问控制,我们可以控制哪些人具有某种权限。比如总公司员工柴其贵、分公司员工李朵朵和营业部员工贾志宏,三个人都具有访问“查询员工”页面权限。

但,由于他们三人所在公司级别不同(总公司、分公司和营业部),进入查询员工页面,系统展示出来的员工数据应该是不同的。

 

此类数据查询权限,在业务系统里面随处可见。毕竟 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 还有怎样与业务系统集成。

2
1
分享到:
评论

相关推荐

    java的细粒度权限和shiro权限校验 ssh

    在Java开发中,细粒度权限管理是一种重要的安全机制,它允许系统对用户访问资源进行精确控制,确保每个用户只能操作他们被授权的部分。Shiro是Apache组织提供的一款强大且易用的Java安全框架,它提供了身份认证、...

    基于RBAC模型的细粒度权限控制

    总之,基于RBAC的细粒度权限控制提供了一种有效且灵活的方式来管理Web应用的访问权限。它通过角色将用户和权限关联,减少了管理开销,增强了系统的安全性和适应性。随着企业需求的不断变化,RBAC模型已成为现代权限...

    Android平台细粒度权限管理系统的研究与实现.pdf

    知识点四:实现细粒度权限管理系统的技术方法 为了实现细粒度的权限管理,研究者们通常需要开发一系列机制和工具来辅助权限的分析和控制。这些工具可能包括权限检测器,它能够分析应用程序请求的权限并检测潜在的...

    细粒度用户评论情感分析数据集(2018-AI-challenger)

    共包含6大类20个细粒度要素的情感倾向.数据集分为训练、验证、测试A与测试B四部分。数据集中的评价对象按照粒度不同划分为两个层次,层次一为粗粒度...每个细粒度要素的情感倾向有四种状态:正向、中性、负向、未提及.

    电信设备-信息系统中细粒度权限管理方法.zip

    在信息系统中,细粒度权限管理(Fine-Grained Access Control, FGAC)是一种重要的安全策略,它允许系统管理员对用户访问资源的权限进行精确控制。这种方法与传统的粗粒度权限管理不同,后者通常只设置如“读取”、...

    基于SpringBoot+shiro实现数据库的细粒度动态权限管理系统

    基于SpringBoot+shiro实现数据库的细粒度动态权限管理系统 项目经过严格测试,确保可以运行!源码无需做任何更改! 基于SpringBoot+shiro实现数据库的细粒度动态权限管理系统 项目经过严格测试,确保可以运行!...

    Android平台下细粒度权限管理机制设计与实现.pdf

    这表明,该细粒度权限管理机制能够在一定程度上有效识别恶意软件,同时减少了误报,提高了用户对权限控制的满意度。 通过这种方式,Android平台的安全性得到了显著提升,用户可以更加自信地管理他们的应用程序,...

    AI Challenger 2018 细粒度用户评论情感分析数据集

    本次比赛我们提供了一个高质量的海量数据集,共包含6大类20个细粒度要素的情感倾向。参赛人员需根据标注的细粒度要素的情感倾向建立算法,对用户评论进行情感挖掘,组委将通过计算参赛者提交预测值和场景真实值之间...

    权限控制之粗粒度与细粒度概念及实现简单介绍

    细粒度权限管理是数据级别的权限管理,例如部门经理可以访问本部门的员工信息,用户只可以看到自己的菜单,大区经理只能查看本辖区的销售订单。 在实现粗粒度权限管理时,可以将权限管理的代码抽取出来在系统架构...

    细粒度情感方面情感数据集

    《细粒度情感方面情感数据集:深度剖析与应用》 在当今的信息化社会,情感分析已经成为数据分析领域的重要分支,特别是在互联网评论、社交媒体等大数据环境中,用户的情感倾向往往能反映出产品或服务的真实口碑。本...

    细粒度位置追踪

    CP-ABE技术允许用户根据自己的权限访问加密数据,实现细粒度的访问控制。同时,通过转换键和代理重加密技术,大部分计算任务被转移到云服务器,减轻了移动设备的计算负担,减少了资源消耗。这意味着移动设备用户可以...

    AppBoxPro细粒度通用权限管理框架源码

    7. **细粒度权限控制**:AppBoxPro强调细粒度权限管理,意味着不仅控制到用户和角色级别,还可以深入到具体的功能和数据记录层面,确保了权限分配的灵活性和安全性。 8. **源码分析**:拥有AppBoxPro的源码,开发者...

    基于Spring Security的细粒度权限管理系统设计源码

    这是一个基于Spring Security框架的细粒度权限管理系统,使用Java语言开发,同时包含JavaScript、CSS、HTML等多种编程语言。该项目共包含2447个文件,其中主要文件类型包括JavaScript、PNG图片、CSS、HTML、JAR包、...

    目标检测数据集:100类大型细粒度飞机图像检测数据集(yolo标注格式)

    项目包含:100类大型细粒度飞机图像检测数据集(yolo标注格式),数据保存按照文件夹保存,经测试,可直接用作目标检测数据集,无需额外处理。 用于细粒度图像检测任务,FGVC数据 【数据总大小】341 MB 【数据集...

    Ai—challenger数据集细粒度情感分析

    本次比赛我们提供了一个高质量的海量数据集,共包含6大类20个细粒度要素的情感倾向。参赛人员需根据标注的细粒度要素的情感倾向建立算法,对用户评论进行情感挖掘,组委将通过计算参赛者提交预测值和场景真实值之间...

    动态代理加注解实现细粒度的权限管理,具体到方法

    在细粒度权限管理中,我们可以在方法上添加自定义的权限注解,比如`@PermissionRequired`,表示调用此方法需要特定的权限。这样,当通过动态代理调用这个方法时,我们可以在invoke方法内检查目标方法上的注解,判断...

    动态代理加注解实现细粒度的权限管理,具体到方法(前面上传的资源修改)

    细粒度权限管理是一种先进的策略,它允许管理员对用户访问系统资源的权限进行更精确的控制,而不是简单的“允许”或“禁止”。本资源通过动态代理和注解技术实现了一种细粒度的权限管理方案,具体到每个方法的级别,...

    【2018hit计算机系统安全】实验二:细粒度权限管理及实现root能力的分发和管理

    ### 细粒度权限管理与Root能力的分发和管理 #### 实验背景与目标 在计算机系统安全领域,权限管理是一项重要的技术措施,用于控制用户对于系统资源的访问级别。其中,细粒度权限管理和root能力的有效管理是确保...

Global site tag (gtag.js) - Google Analytics