Sage Crm 权限原理分析
文字是11年写的,贴出来共享一下,先来一张表结构图:
一、区域。表名:【territories】
1、我们先来看看区域表的结构。
从图中前面都是不能为空的字段,都是很重要的。来介绍一下这些字段:
Terr_territoryid: 这个字段就是区域码
Terr_DBID:由于上面这个字段用来保存区域码了,所以用这个来做表的id
Terr_Caption:区域码的中文名称,我们新建区域,只需要输入这个就可以了。
Terr_ParentID:父区域的区域码。如果是根区域的话,父区域为空。
Terr_RangeEnd:区域的范围码。具体含义下面会介绍。
Terr_NextRangeStart:下一个子区域的区域码
Terr_ChildCount:该区域的直接子区域个数
Terr_Depth:该区域在区域树中的层数。
2、系统对区域码的分配机制(以下讲解都是在系统默认情况下的)
在进一步解释新建区域,系统往区域表插入记录之前,必须先讲讲系统对区域码的分配机制,这样我们才能更加明白,系统对这个区域表的设计。
下面的内容比较理论,文件比较多,有兴趣的话,慢慢看就明白了。
1) 从表的结构我们可以看到区域码的数据类型是整型的。数据库中int 类型的大小范围是:-2147483648至2147483647。他们的总和刚好是2的32次方。
2) 系统在默认情况下是这样设置区域的:
A,顶级区域的区域码肯定是:-2147483640 ,所以只要大于这个数的区域都是他的子区域。
B, 系统会默认每个区域的子区域都是2的4次方个,即16个。这样的话,让我们看看我们的系统最终区域的划分结果:
一,2 - 28 【268435454】
二、2 - 24 【16777216】
三、2 - 20 【1048576】
四、2 - 16 【65536】
五、2 - 12 【4096】
六、2 - 8 【256】
七、2 - 4 【16】
一表示第一个级子区域,他的上面就是顶级区域了。2的32次方分为16个子区域之后,每个子区域的范围就是2的28次方,也就是 268435454。这样一直递减。
C,上面的分析,我们知道我们的系统一共可以分为8个级别,每个级别(顶级除外)可以有16个区域。16的8次方就是 2的32次方了。
3) C、看到这里,我们会问两个问题:为什么是默认16呢?如果我的子公司不止16个或者我们的级别不止8个呢?
问题1:首先,16刚好是2的倍数,容易计算和划分,可以最大限度的利用区域码,其次,我觉得16 对于二进制的装换有优势。这些是我个人的看法而已。可能是错的。
问题2:当出现这种情况的时候,新建第15或者16个子区域的时候,系统会提示我们先平衡区域。我在252的crm 数据库做了一次平衡。一共有95步,可能我们的表太多了。平衡的过程其实就是在重新选一个基数,扩大了子区域个数表大之后,级别的就会表小,调整之后,还要修复已有数据的区域码。 其实一般的公司是很难达到这个数的。例如我们的国家:国家-省-市-县-镇-乡 也才六个级别。假设每个省下面也是23个市。 23 的 6次方也没有大于2的32次方。
3,数据库的设计方面
有了上面的机制之后,再来看看数据库表现。
如图,
a) worldwide这个是顶级区域,所以他的父区域为0。而E总部的terr_parentid 就是 worldwide的区域码了。新建区域的时候系统会要求我们选择一个父区域的。
b)Terr_RangeEnd这个字段的值就是Terr_territoryid + 这个级别的区间的范围基数了。
l 顶级区域当然是最大的区间 为-2147483648 + 2的32次方 = 2147483647
l E总部是二级区域所以 是 -1342177274 + 2的28次方 = -1073741820
l …………..
l 所以我们可以理解为:所有自己的子区域都是在 [Terr_territoryid,Terr_RangeEnd] 这两个字段组成的区间之内的。
c) terr_caption 是新建时候的翻译而已,不多说。
d)Terr_nextRangeStart 这个字段的意思是下一个子区域的区域码,例如worldwide 只有一个子区域E总部,所以我们新建一个E总部的同级区域时,这个新区域的区域码就是-805306364了。本来子区域的第一个区域的区域码应该是父区域码加1的,由于我们的E总部是在以前的基础上删改的,所以…。从留学中心之后你就可以看到了。Terr_nextRangeStart 这个字段不但告诉我们下一个子区域的区域码,同时也是告诉我们本区域内的范围的区间可以缩小为:[Terr_territoryid,Terr_NextRangeStart]。
e)Terr_ChildCount:该区域的直接子区域个数。留学中心暂时有13个分公司,所以他的直接子区域是13
f)Terr_Depth:该区域在区域树中的层数。留学中心在第三层,但是数据库从0开始,所以显示为2。
g)这里还有一个字段要讲一下的:terr_rangeincrement,这个字段记录着子区域的 范围基数如图:
二、配置文件 【TerritoryProfiles】
只保存了基本信息而已。主要的配置信息保存在表【TerritoryPermissions】
三.配置信息【TerritoryPermissions】
这个配置表中保存了我们新建的配置文件的信息和直接权限的信息。每个配置文件,每个区域都会把所有的主要实体列出来给我们设置。 配置文件、区域和表就关联起来了。
直接权限也一样,要求我们要选一个区域,然后才添加用户到这个区域,再设置表的权限。
直接权限和配置表的数据的区别就在于 usrt_userid 和 usrt_profileid。usrt_userid不为空就是直接权限的数据。usrt_profileid不为空就是配置文件。
四,使用实例
当用户到机会模板的高级查找查询数据时:
系统首先会找到登录用户的id 和 用户表里面的 配置配置文件id。
然后到这个视图去找登录用户的权限:
select * from dbo.vTerritoryPermissions where (usrt_userid = 630 or usrt_profileid = 10) and bord_tableid = 10167
上图显示了查询结果是我在配置表中的一个直接权限 和 配置文件签约顾问或客服中的四个区域的权限。
然后在去找机会表过滤数据。
五,权限的一些特殊应用例子
1,在某客户的系统的管道图,由于管道图的sql 语句要用到group by 所以标准的findrecord满足不了,所以出现了管道图中的数据和列表的数据不一至。我是这样做的:先用findrecord找出数据,然后把这些数据的id打包起来放到管道图中sql 语句中限制范围。
2,还是某客户的系统,用户需要把数据提交给数据所在区域的上一级区域的领导。这样,我们就可以先找到这条数据的区域,然后在去找父级区域,再到配置表中找对应的区域的角色。在测试中,不生效,可能系统不容许查询区域表,也有可能是生成脚本不支持而已,我会继续测试。
为什么要去研究系统的权限,有什么作用?
可能大家未必会看,而且我水平有限,大家也未必看明白了。我们现在对标准功能越来越熟悉了,可是我想知其然,还要知其所以然。了解系统设计对我们理解系统的运作,理解系统的业务有比较大作用。对于遇到需要跳出系统标准功能来设计系统的时候,我们知道了系统的设计就不会那么的茫然,最起码可以降低风险。
Sage Crm 权限原理分析的更多相关文章
- ECSHOP后台权限分配原理分析
1.在权限管理->管理员列表,中添加一名管理员 2.在admin\includes\inc_menu.php $modules['02_cat_and_goods']['01_goods_lis ...
- Shiro框架 (原理分析与简单实现)
Shiro框架(原理分析与简单实现) 有兴趣的同学也可以阅读我之前分享的:Java权限管理(授权与认证)CRM权限管理 (PS : 这篇博客里面的实现方式没有使用框架,完全是手写的授权与认证,可以 ...
- 使用AsyncTask异步更新UI界面及原理分析
概述: AsyncTask是在Android SDK 1.5之后推出的一个方便编写后台线程与UI线程交互的辅助类.AsyncTask的内部实现是一个线程池,所有提交的异步任务都会在这个线程池中的工作线 ...
- (转)Android 系统 root 破解原理分析
现在Android系统的root破解基本上成为大家的必备技能!网上也有很多中一键破解的软件,使root破解越来越容易.但是你思考过root破解的 原理吗?root破解的本质是什么呢?难道是利用了Lin ...
- 【转载】JavaEE权限管理分析
JavaEE权限管理分析 一.背景 在 Web 应用开发中,安全一直是非常重要的一个方面.安全虽然属于应用的非功能性需求,但是应该在应用开发的初期就考虑进来.如果在应用开发的后期才考虑安全的问题,就可 ...
- HTML5 移动应用开发环境搭建及原理分析
开发环境搭建: 一.Android 开发平台搭建 安装java jdk:\\10.194.151.132\Mewfile\tmp\ADT 配置java jdk 1) 新建系统变量,JAVA_HOME ...
- Android应用程序组件Content Provider在应用程序之间共享数据的原理分析
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6967204 在Android系统中,不同的应用 ...
- Android平台APK分析工具包androguard的部署使用和原理分析
原创文章,转载请注明出处,谢谢. Android应用程序分析主要有静态分析和动态分析两种,常见的静态分析工具是Apktool.dex2jar以及jdgui.今天突然主要到Google code上有个叫 ...
- Android 4.4 KitKat NotificationManagerService使用具体解释与原理分析(一)__使用具体解释
概况 Android在4.3的版本号中(即API 18)增加了NotificationListenerService,依据SDK的描写叙述(AndroidDeveloper)能够知道,当系统收到新的通 ...
随机推荐
- MVC AjaxOptions 中的OnSuccess方法执行多次的问题
原因是单个页面嵌套多个部分视图,而多个视图中有多个表单提交但是Onsuccess方法的函数名是一样的. 例如主页面的Onsuccess方法叫success 点击部分视图后js文件又含有一个succes ...
- mysql主从
1 系统规划 1.1 mysql版本 Mysql版本 mysql-5.5.51 1.2 服务器地址 服务器地址 10.180.2.167 1.3 mysql目录 主 ...
- 安装SQL Developer,连接Oracle 12c,创建新用户
1.访问Oracle官网:https://www.oracle.com/index.html,下载SQL Developer 2.安装... 3.打开Sql Developer,右键"创建新 ...
- for_each(c++11)
http://www.cplusplus.com/reference/algorithm/for_each/ template<class InputIterator, class Functi ...
- C#重启IIS指定网站和指定应用程序池
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- Android中surface,surfaceview,sufaceholder以及surface客户端的关系
这里以照相机camera功能的实现来解释surface,surfaceview,sufaceholder以及surface客户端(本例子中指的是camera)的关系,surface及其client(客 ...
- jquery json数组(排序)
ar nums = ['12','2','5','36','4']; $('#show7').html(nums.join('<br/>')); //定义了sort的比较函数 nums = ...
- UWP学习记录8-设计和UI之控件和模式5
UWP学习记录8-设计和UI之控件和模式5 1.日历.日期和时间控件 日期和时间控件提供了标准的本地化方法,可供用户在应用中查看并设置日期和时间值. 有四个日期和时间控件可供选择,选择的依据如下: 日 ...
- MySQL开发规范
字段设计 (1)建议使用UNSIGNED存储非负数值. (2)建议使用INT UNSIGNED存储IPV4. (4)INT类型固定占用4字节存储,例如INT(4)仅代表显示字符宽度为4位,不代表存储长 ...
- windows 物理内存获取
由于我一般使用的虚拟内存, 有时我们需要获取到物理内存中的数据(也就是内存条中的真实数据), 按理说是很简单,打开物理内存,读取就可以了.但似乎没这么简单: #include "window ...