为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

Ralasafe_Cookbook_1.1_RC1(zh)

2013-05-08 13页 pdf 420KB 49阅读

用户头像

is_986367

暂无简介

举报
Ralasafe_Cookbook_1.1_RC1(zh) Rala safe Cookbook Ralasafe Cookbook 版本:Ralasafe 1.1 RC1 作者:汪金保 邮件:ralasafe@gmail.com 网站:www.ralasafe.cn 日期:2011-6-21 http://www.ralasafe.cn Rala safe Cookbook 内容目录 ...
Ralasafe_Cookbook_1.1_RC1(zh)
Rala safe Cookbook Ralasafe Cookbook 版本:Ralasafe 1.1 RC1 作者:汪金保 邮件:ralasafe@gmail.com 网站:www.ralasafe.cn 日期:2011-6-21 http://www.ralasafe.cn Rala safe Cookbook 内容目录 1.概述..................................................................................................................................................3 2.与部署......................................................................................................................................3 2.1.架构..........................................................................................................................................3 2.2.部署..........................................................................................................................................4 3.权限与业务解耦合——Ralasafe API.............................................................................................4 3.1.解耦合理论分析......................................................................................................................4 3.2.Ralasafe 做更多........................................................................................................................4 3.3.权限 API...................................................................................................................................4 3.4.权限 ID.....................................................................................................................................5 3.5.用户信息..................................................................................................................................5 3.6.上下文......................................................................................................................................6 3.7.查询返回结果..........................................................................................................................6 3.8.决策返回结果..........................................................................................................................6 3.9.其他 API...................................................................................................................................6 4.权限模型..........................................................................................................................................7 4.1.核心概念..................................................................................................................................7 4.1.1.用户分类...........................................................................................................................8 4.1.2.业务数据分类...................................................................................................................8 4.1.3.数据查询...........................................................................................................................9 4.2.权限模型..................................................................................................................................9 4.2.1.查询权限模型...................................................................................................................9 4.2.2.决策权限模型.................................................................................................................10 4.3.权限数据来源........................................................................................................................10 4.3.1.固定值.............................................................................................................................11 4.3.2.用户属性.........................................................................................................................11 4.3.3.业务数据属性.................................................................................................................11 4.3.4.上下文值.........................................................................................................................12 4.3.5.数据查询.........................................................................................................................12 http://www.ralasafe.cn Rala safe Cookbook 1. 概述 Ralasafe 访问控制中间件(数据级权限管理),是 MIT 协议开源免费软件产品。它使用图形 化方式处理各种数据级权限管理问题,包括数据库行列级、字段内容级权限问题;它还能处 理登录控制、功能级权限控制和 URL 权限认证。 使用 Ralasafe,可以做到 1. 权限与业务解耦合——实践更清晰的系统架构 2. 权限管理完全图形化管理,不需要写一行代码或 XML 文件(基本配置信息除外,如 数据源和用户元数据)——实践高效开发 3. 所有访问控制被集中、化管理——实践访问模式的统一,减少安全漏洞 Ralasafe 完全遵循 JAVA EE 规范,跨平台、web 服务器和主流数据库。 2. 架构与部署 2.1.架构 Ralasafe 访问控制中间件包括 2 大部分: 1. 权限引擎 2. Web 管理控制端 权限引擎是 jar 包,1.1RC1 版本大小 846KB,非常精简。引用了 castor、beanshell、jakarta- commons、gson 等第三方包,共 6.69M。权限引擎负责对安全策略进行解析,并返回解析结 果。 Web 管理控制端,使用 jQuery+jsp 技术编写,展开大小 1.79M。Web 控制端则负责图形化方 式定制安全策略,在线图形化方式测试安全策略。 Ralasafe 没有使用任何第三方,虽然给 Ralasafe 开发带来一些难度。但给集成 Ralasafe 开发者带来了更多福音—— 1. Ralasafe 中间件无框架要求,可以和任何框架集成 http://www.ralasafe.cn Rala safe Cookbook 2. Ralasafe 中间件无框架,和你将选用(或者已选用)的框架无冲突 2.2.部署 权限引擎是必须与应用集成部署的。 Web 管理控制端可选部署。你可以将 Web 管理控制端与应用一起部署;你也可以只在开发 阶段使用,在生产部署时,不部署 Web 管理控制端。 3. 权限与业务解耦合——Ralasafe API 3.1.解耦合理论分析 权限与业务解耦合,非常有必要,也非常难。因为权限、尤其是数据级权限,与业务紧密耦 合。有的时候甚至很难区分哪个是权限、哪个是业务;另外,需求变化也经常影响到权限模 型、业务模型的变动。所有这些造成“数不清理还乱”的感觉。 只有实现如下目标,才能做到权限与业务解耦合,并适应不同需求和需求变化: 1. 权限模型和业务模型,可以随时独立变动(增加、减少、修改等) 2. 权限逻辑的变化,可以独立于业务进行修改 也就是说,我们需要一个缓冲带、中间件! 3.2.Ralasafe 做更多 Ralasafe就是这样的中间件,它能够适配业务模型、数据模型和权限模型,并将权限逻辑独 立于业务进行集中管理。Ralasafe 不仅实现了上述目标,而且做了更多: 1. 集中管理权限 2. 图形化管理权限 3. 图形化测试权限 4. 对权限逻辑变动,无需重启应用,即时生效 Ralasafe 适配业务模型:查询权限可以将数据以你指定的业务模型(Javabean)格式返回;权限运算可 以“钻取”业务数据的属性,进行权限规则计算。 Ralasafe 适配数据模型:可以在线读取数据库表结构,在线定制数据查询,并指定查询返回结果以哪个 业务模型(Javabean)格式返回。 Ralasafe 适配权限模式:随时增加、修改权限模式,随时增加、修改权限策略。 http://www.ralasafe.cn Rala safe Cookbook 3.3.权限 API Ralasafe API 在你需要权限判断的地方,调用一下;就像 LOG4J API那样,你在需要写日志 的地方,调用一下。 功能级权限判断API 一个;数据级权限判断API两个,分别对应从系统获取数据或者向系统 提交数据两个方向——有称为查询权限、决策权限。 package org.ralasafe; import org.ralasafe.entitle.Decision; import org.ralasafe.entitle.QueryResult; import org.ralasafe.user.User; public class Ralasafe { public static boolean hasPrivilege(int privilegeId, User user) { .... } public static QueryResult query(int privilegeId, User user, Map context) { .... } public static Decision permit(int privilegeId, User user, Object businessData, Map context) { .... } } API 非常简单,除了权限 id(int privilegeId)外,不包含其他任何权限信息。也只有这样才 能做到权限与业务解耦合。所有权限逻辑全部在安全策略里面。当应用系统请求 Ralasafe API 的时候,Ralasafe 权限引擎将解析相关安全策略,并返回解析结果。(如前面所说,安 全策略由 Ralasafe Web 控制端图形化定制管理。) 3.4.权限 ID 权限 ID 用来标识当前请求的是什么权限。查询员工权限呢,还是订单修改权限。权限 ID 可 以通过 Ralasafe Web 控制端导出,然后保存到你的业务常量类里面,如 com.your.company.Constants。 调用 API 时,直接使用常量引用,而不是数字。如: Ralasafe.hasPrivilege( Constants.QUERY_EMPLOYEE, user )。 3.5.用户信息 权限判断还要告知当前用户是谁。该用户应该是成功通过身份验证的用户。你可以使用 http://www.ralasafe.cn Rala safe Cookbook Ralasafe自带的 LoginFilter 来构建User,或者自行构建User 对象。 自行构建User 对象非常简单。 import org.ralasafe.user.User; User user=new User(); user.setId( userId ); user.set( "field1", value1 ); user.set( "field2", value2 ); new 一个对象,然后使用 set 对 User 的各个属性进行设置。(Ralasafe 对用户属性描述,通 过用户元数据进行描述。描述用户表在哪里,用户表有哪些字段,分别代表什么业务意 义。) 3.6.上下文 Map context指上下文,有的权限策略需要从上下文获取值进行权限计算,此时就需要提供 上下文;有的权限策略不需要上下文,此时可以不必提供上下文,直接用 null 做参数。 我们考察这个策略:本人当前借款记录。该策略应该对应数据查询: select * from LoanMoney where userId=? and loanDate=? 其中第一个参数是用户 id,Ralasafe 引擎可以直接从User 中“钻取”获得; 第二个参数是借款日期,表示当天。此时我们可以将当天日期放入上下文,Ralasafe自动从 上下文“钻取”。如果我们约定该上下文键值(key)是 today,那么调用 Ralasafe 的 API 则是: Map context=new HashMap(); context.put( "today", new java.util.Date() ); Ralasafe.query( privilegeId, user, context ); 3.7.查询返回结果 Ralasafe 查询权限返回 QueryResult,包含这些信息: 1. Collection,以你的业务模型格式返回的查询结果; 如果没用查询权限,返回空集合(非 NULL) 2. int totalCount,为界面分页显示提供的,如果完整执行该查询可以返回总记录条数 3. Collection fields,当前用户允许查询业务模型哪些字段。比如订单有 10 个字 段,当前用户能查看 6 个字段,这就表示那 6 个字段(注:如果当前用户只能查看 6 个字段,返回的 Javabean 也只设置这 6 个字段值,其他 4 个字段不予查询和设置值) 4. Collection readOnlyFields,当前用户对哪些字段是只读的,不能进行修改 http://www.ralasafe.cn Rala safe Cookbook 3.8.决策返回结果 Ralasafe 决策权限返回结果 Decision,包含这些信息: 1. boolean permit,是否允许当前用户对该数据(Object businsessData)进行操作 2. String denyReason,如果拒绝当前用户对该数据(Object businessData)进行操作,拒 绝理由是什么! 3.9.其他 API org.ralasafe.Ralasafe围绕这 2 大 API 还提供了其他 API,如自定义条件查询(输入 CustomizedWhere条件),分页查询,只查询记录条数 queryCount 等 org.ralasafe.WebRalasafe 是针对 Web 应用程序对 Ralasafe 进行封装。用户数据直接从 request.getSession()中获取,将拒绝理由设置到 request.setAttribute()等,方便web程序的交互 方式。可以参考源码或者 JavaDoc,此处不做详述。 4. 权限模型 Ralasafe 权限控制包括 2 大部分:功能级权限控制和数据级权限控制。功能级权限控制使用 通用的 RBAC 模型,即给用户赋予角色,给角色赋予权限。 Ralasafe通过对 RBAC 模型做简单扩展实现数据级权限,即给每个权限赋予一条或者多条安 全策略。安全策略主要有:用户分类和资源两大要素组成。 当 Ralasafe API 被请求时,权限引擎会首先验证当前用户是否有功能权限;如果有功能权限, 然后继续进行数据级权限验证。 4.1.核心概念 Ralasafe 核心概念有: 1. 用户分类 2. 资源,主要是 http://www.ralasafe.cn 用户 角色 权限 1:* 1:* Rala safe Cookbook 1. 业务数据分类 2. 数据查询 这些概念并不是凭空捏造,都是来源于现实的权限需求,只是平常我们都会忽略了它们。让 我们细细想想: 1. 权限问题是否都是在探讨这样的问题:当什么情况下,怎么怎么样?当另一种情况下, 又怎么怎么样?当另一种情况下,又怎么怎么样?...... 2. 这样的问题,总是可以用这种方式来解答:什么样的用户能看到哪些数据,操作哪些 数据;什么样的用户又能看到哪些数据,操作哪些数据;....... 什么样的用户,就是“用户分类”! 能看到哪些数据,就是“数据查询”!! 操作哪些数据,就是“业务数据分类”!!! 4.1.1. 用户分类 绝大部分人听到用户分类,都会想到角色。诚然,角色和用户分类都是对用户进行划分。但 角色是一种静态划分;用户分类属于动态划分,是一种动态用户群组。 静态划分意思是:我们首先将某角色赋予给用户后,用户才隶属于该角色; 动态划分意思是:我们使用规则对用户进行描述,如果用户满足该规则描述,则属于该“用 户分类”,无需事先将用户划到该用户群组。这种隶属关系是基于规则运算。 考察如下例子: 1. 用户分类名称:总公司用户;规则是:用户的机构 ID=总公司机构 ID 2. 用户分类名称:分公司用户;规则是:用户的机构 level=分公司机构 level 3. 用户分类名称:北京分公司用户;规则是:用户的机构 ID=北京分公司机构 ID 以上分类基于用户的属性进行规则判定。下面,再考察其他类型的分类: 1. 用户分类名称:临时调查组用户;规则是:用户的 id号在数据表临时调查组 (SPEC_USER)有记录。 Ralasafe 的用户分类是开放的,你可以通过 Ralasafe Web 控制端进行随意定制。还可以按照 http://www.ralasafe.cn Rala safe Cookbook 树形结构,将用户分类有规律的管理起来。 另外,通过 Ralasafe创建角色的时候,Ralasafe会自动创建一个对应的用户分类——隶属该 角色的用户分类。规则是:当前用户的角色集合中含有该角色,即如果当前创建的角色是管 理员角色,那么规则就是:当前用户的角色集合中含有管理员角色。 对于初学者,角色和用户分类概念不仅理解起来有点难度,使用起来也有一定难度。不知道什么情况下 使用角色,什么情况下使用用户分类。 推荐准则:角色放在功能级控制层面;用户分类属于数据级控制层面。 总是思考这样的问题: “什么样的用户能看到哪些数据,操作哪些数据;什么样的用户又能看到哪些 数据,操作哪些数据”。 就是考虑这个“样”,这个“范”,这个“style"。 4.1.2. 业务数据分类 业务数据分类和用户分类概念一致。用户分类是对用户的动态分类,基于规则描述,动态匹 配计算;业务数据分类是对业务数据的动态分类,基于规则描述,动态匹配计算。 Ralasafe 不限定该业务数据分类的类继承关系,也无需实现 Ralasafe 的某个接口类。只要是 个 JavaBean 就可以了。Ralasafe 需要使用 Java 反射技术对业务数据相关属性进行读取。比如 name 属性,会反射调用 getName()方法。 考察如下例子: 1. 业务数据分类名称:大于 5000 的取款;规则是:金额字段值大于 5000 继续考察如下复杂一些的例子: 1. 业务数据分类名称:登录用户所在公司的订单;规则是:订单的机构 id=登录用户的 机构 id 2. 业务数据分类名称:加上本笔取款全体取款额大于 20000;规则是:本笔取款额+数 据查询(当天本人取款额之和)>20000 4.1.3. 数据查询 数据查询和我们平常写的 SQL 查询概念一致,可以像 Java PreparedStatement 一样动态注入 参数。 http://www.ralasafe.cn Rala safe Cookbook 4.2.权限模型 有了上述概念后,我们详述一下 Ralasafe 的数据级权限管理模型。 4.2.1. 查询权限模型 查询权限举例:人力专员按照机构层级查询员工。人力专员由 RBAC角色控制,数据级安全 策略如下: 策略序号 用户分类 数据查询 1 总公司用户 查询所有员工 2 分公司用户 查询所在分公司及下属营业部员工 3 营业部用户 查询所在营业部员工 http://www.ralasafe.cn 用户 角色 1:* 1:* 权限 安全策略 1:* 用户分类 数据查询 1:1 1:1 Rala safe Cookbook 4.2.2. 决策权限模型 决策权限举例:每笔借款不超过 5000 元;每天借款总额又不能超过 20000 元。 策略 序号 决策 用户分类 业务数据分类 拒绝理由 1 拒绝 所有人 大于 5000 的借款 单笔借款不能超过 5000 元 2 允许 所有人 加上本笔全体借款大于 20000 的借款 全体借款总额不能超过 20000 元 4.3.权限数据来源 Ralasafe 权限引擎会自动从固定值、用户、上下文、业务数据和数据库查询中“钻取”值,进 行权限计算。权限规则可以是简单的比较计算(=,!=,>,<,>=,<=,),NULL判断计算(NULL, NOT NULL),IN 集合比较(IN, NOT IN),也可以是上述规则组合形成规则组。规则组里 面还可以嵌套规则组。 这些数据来源和计算规则,完全足够权限判断了。如果,你觉得不过瘾,Ralasafe 还支持你 写原生态的 Java 代码,或者调用你的 Java API。 在定制 Ralasafe 规则(用户分类、业务数据分类和数据查询)的时候,你可以使用这些权限 数据。 http://www.ralasafe.cn 用户 角色 1:* 1:* 权限 安全策略 1:* 用户分类 业务数据分类 1:1 1:1 决策 (允许 /拒绝) 拒绝理由 1:1 1:1 Rala safe Cookbook 4.3.1. 固定值 就是确定值,不会变化的。比如定制用户分类——“总公司用户”时,规则是将用户的 companyLevel 属性与固定值 1 进行比较。 所以,我们定义了一个固定值变量 headOfficeCompanyLevel,设置值等于 1。 4.3.2. 用户属性 如上面所说的“总公司用户”,需要读取用户属性 companyLevel,我们定义了一个变量 userCompanyLevel,设置值等于用户属性的 companyLevel。权限引擎计算时,会动态调用 user.get( "companyLevel" ),然后将值付给 userCompanyLevel。 定制数据查询——“登录用户所在公司”,其中 where条件是 company表的 id 字段等于用户的 companyId 属性。权限引擎计算时,会动态调用 user.get( "companyLevel" ),设置到 PreparedStatement 查询参数里面。 4.3.3. 业务数据属性 比如我们定制业务数据分类——“单笔借款大于 5000 元”。规则是用户数据的 money 属性与 固定值 5000 做比较。权限引擎会自动调用传入对象的 getMoney()方法获取值,与 5000 进行 比较。 LoanMoney money=new LoanMoney(); money.setLoanDate( new Date() ); User user=WebRalasafe.getCurrentUser(req); money.setUserId( ((Integer)user.get( User.idFieldName ) ).intValue() ); String strMoney=req.getParameter( "money" ); money.setMoney( Integer.parseInt( strMoney ) ); if( WebRalasafe.permit( req, Privilege.LOAN, money, context ) ) { loanManager.addLoadMoney( money ); } 如上代码,就会调用 LoanMoney 类的 getMoney()方法。如果是其他类,也必须要有 getMoney 方法。 如果你指定业务数据属性是 abc,那么该类必须要有 getAbc()方法。总之,遵循通用的 Javabean 规范。 http://www.ralasafe.cn Rala safe Cookbook 4.3.4. 上下文值 比如我们定制数据查询——“本人当天借款记录”,其中有个 where条件是 LoanMoney表的 loanDate 属性等于“键值为 today 的上下文值”。 Map context=new HashMap(); context.put( "today", new java.util.Date() ); Ralasafe.query( privilegeId, user, context ); 如上代码,我们将 today放入上下文。权限引擎执行查询时,自动从上下文“钻取”参数,设 置到 PreparedStatement 查询参数里面。 4.3.5. 数据查询 Ralasafe 的规则里面还能调用数据查询,将查询结果进行规则计算。比如,创建角色完毕后, 自动生成的对应用户分类规则是:角色 id 是否在数据查询(当前用户所有角色集合)里面。 伪代码是:roleId in (Collection: query( select roleId from ralasafe_ralasfe_role where userId=$ {user.id} ) ) 再比如业务数据分类——“加上本笔借款全体借款额不超过 20000”。规则中也用到了数据查 询——“查询本人当前总借款额”。该业务数据分类的规则是:20000-query( select sum(money) where userid=${user.id} and loanDate=${context.today} ) >=$ {businessData}.money。 http://www.ralasafe.cn
/
本文档为【Ralasafe_Cookbook_1.1_RC1(zh)】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索