Post navigation
我最近在开发项目,使用了Ralasafe。Ralasafe的查询设计能够自动帮忙进行orm,能够根据列名进行ORM(如:name映射到name,someName映射到some_name等);能够根据表名列名、实体bean的级联映射(如:domain表的id字段映射到domain<Domain>属性的id属性)。
有的时候,我有这样的Java 实体bean。
1
2
3
4
5
6
|
public
UrlApp {
private
int
id;
private
String domainName;
private
String appName;
....
}
|
我希望domainName属性自动与关联表domain的name列进行关联;appName属性自动与关联表app的name列进行关联。(现在是:domainName/appName无法得到自动关联,需要手工改动;ralasafe自动将domain和app表的name属性都关联到name java属性)
该功能现已实现,并提交到SVN。感觉orm更加智能了,手工编辑工作量又少了一些!
Posted in 源代码
|
Tagged desginer, ORM, 智能
|
今天上海开源委员会让我统计一下Ralasafe使用情况。我在Ralasafe QQ群里面喊了几句,不少网友响应,将其集成的案例分享出来。因为有的案例,不方便告知公司或者客户名称,就使用xxx代替了。以下是名单,也欢迎遗漏的朋友们补充:
- xxx银行对公客户关系管理系统
- 太极计算机执行案件管理系统
- 急速迷
- 开放医疗平台freehealth
- 新时代信托管理系统
- xxx信用社协同办公平台
- 健康促进物联网
- 北京天下图数据技术有限公司内部项目管理系统
- 北京xxx电子商务互联网公司CRM管理系统
- 杭州xxx电子商务互联网公司CRM管理系统
- xxx审计项目成本核算系统
- 东盟博览会在线摇奖管理系统
- 福州xxx OA管理系统
- 广州国润科技 OA项目
- 江门市氯气瓶监控平台
- xxx特种设备–电梯设备监控平台
- 美包包
- 医疗订单集成系统OIS
Posted in 应用实践
|
Tagged 集成案例
|
优盟通讯9月刊出炉了,欢迎各位开源爱好者下载阅读。
优盟全称“开源及基础软件通用技术创新战略联盟”,是一个年轻的创新性组织,“建立开源社区,实现国产基础软件产业化推广模式的创新”是优盟的发展目标之 一,所以优盟自成立以来,一直密切关注着中国国内社区的发展,给予了国内社区大量的支持,为中国开源社区的发展作出了突出贡献。为了让更多的人及时跟踪优 盟及各成员单位的最新动态,深层次透视政府政策导向,迅速获悉开源领域的最新资讯,优盟特创此电子期刊——《优盟通讯》,这不仅是一个高效的 “宣传渠道”,更是一个您了解开源领域最新态势,及政府政策导向的“窗口”。
Posted in Uncategorized
|
Tagged 优盟
|
引子
几年前,我开始讲权限管理中间件时。我周边所有人几乎都把它与每个系统的权限设置模块相对应。也有不少系统将“权限设置”,写为“权限管理”。不深入追究意思,差别也不大。
通过这几年下来,虽然做了很多宣传,很多普及,但还是有很多人这么认为。因此写本文做一些讲解。
权限管理
权限管理,应该包括权限设置(授权)和权限验证(鉴权)两大部分。我觉得还可以添加一项权限测试。
权限设置(授权),是用户可见的,用户通过界面进行操作。最好还能做相关测试,以检测设置是否正确。这就是为什么我添加了权限测试。
其中,权限设置又包括功能级权限设置和数据级权限设置。
权限认证(鉴权),是用户不可见的。由系统后端进行权限判断。Ralasafe的权限引擎,就实现了该功能。
权限在哪里与业务分离
权限与业务分离,是指权限验证与业务逻辑判断分离。并不是指权限设置非常通用,可以表达各种权限逻辑或者权限关系。
而,现实中我们很多系统权限验证逻辑和业务逻辑是混杂在一起的,根本就没有把权限提取出来。那么,怎样才算把权限提取出来了呢?业务方法做到与用户无关,就是简单做一件事情。
- 无用户无关:业务方法不区分这是谁,都按照同样逻辑做事
- 做一件事情:说明该方法高内聚,低耦合
只有实现了权限与业务分离,才能使业务系统SOA化!每个都是服务。
Ralasafe是怎样做权限管理的呢?
Ralasafe架构讲明了Ralasafe包括权限引擎和Web控制端2大组件。
Ralasafe的web控制端能够实现功能级权限设置,又能做数据级权限设置。设置完毕后,还能做权限测试,验证是否设置正确。
Ralasafe权限引擎,负责鉴权,返回鉴权结果。
Posted in 文档
|
Tagged ralasafe, 授权, 权限分离, 权限管理, 鉴权
|
哈哈,现在Ralasafe的文章收录速度越来越快!包括Ralasafe.cn网站内容,还有其他网站书写的关于Ralasafe内容。
Ralasafe志愿者写了篇文章:写在Ralasafe1.2版本发布之后 2.0版本发布之前
非常高兴看到社区朋友不断互动,我就爱看到这种效果。这种互动,也会促使我开源的热心;如果没有互动,我很快就不会再维护开源了。毕竟,我也是人嘛~
他的文章很长,内容很充实。因此,给予认真回复:
感谢张同学这么长时间跟踪Ralasafe,并且在开发系统里面使用Ralasafe!
文章发出来,2个顶,3个踩。说明很多开发者可能没有从中读取到需要的东西。虽然,我是看到了很多东西。这和我对Ralasafe非常熟悉,是有关的。
- 1.0版本,GWT界面借助了应用程序样式,把功能在一个页面表现的淋漓尽致;
- 1.1版本,采用jQuery的目的,是为了开发者更容易定制,同时大幅缩减了Ralasafe web控制端大小。从50M缩减到1.3M;
- 1.2版本,从集成舒适性角度,将Ralasafe相关内容进一步分离出来。
Ralasafe定位非常明确,定位且仅定位于权限管理领域,深入解决数据级权限管理问题。身份认证等问题,有很多集成方案,Ralasafe不会重复造轮。最方便的方案,应该使用Shino了,Spring Security已经非常庞大。
Ralasafe坚持社区化研发路线,将研发过程社区化,对社区透明;倾听社区声音,社区也积极参与进来。张同学,你就是一名参与者。为我们贡献了代码,设计讨论,1.1版本的ORACLE分发包。
期待,大家继续!开源努力!
Posted in 应用实践, 社区建设
|
Tagged 权限管理, 社区反馈
|
陆续有开发者咨询:怎样只使用Ralasafe查询权限的where条件,查询继续使用自己的ORM框架?
我的回答是:鼓励使用Ralasafe的查询权限,不使用你的ORM。当然,使用Ralasafe的where,继续使用你的ORM也是可以的。
原因如下:
- 改动小:使用Ralasafe的查询权限,对你的ORM代码改动小,不需要改动你原来的查询代码。只要在你的web/service层调用Ralasafe查询API即可
- 收益大:权限管理中的数据级查询权限,往往非常复杂。需求有:行级、列级。只给你where条件,能控制行级,但不能控制列级。Ralasafe查询权限可以做到控制列级
下面,我们给出一些代码示例做比较。这是不用Ralasafe,开发者需要编写的查询DAO代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
/**
查询所有
*/
public
Collection selectAll() {
...
}
/**
根据用户id进行查询
*/
public
Collection selectByUser(
int
userId ) {
...
}
/**
根据组织机构进行查询
*/
public
Collection selectByOrgId(
int
orgId ) {
...
}
/**
根据机构层级查询
*/
public
Collection selectCacadeByOrgId(
int
orgId ) {
...
}
|
需要多少个方法,由权限管理需求的复杂性。权限管理需求越复杂,方法就越多。每个方法,当然都需要开发者人工编写。
其实这些方法是远远不够的,即使不考虑需求变化。很明显少了这样的方法:
- 根据条件进行查询
- 查询总记录条数
- 分页查询
巴拉巴拉,我们是苦命的程序员。又要编写很多DAO方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
/**
查询记录总数:
此处应该是selectAllCount, selectByUserIdCount, selectByOrgIdCount
selectCascadeByOrgIdCount等
*/
public
int
select...Count(...) {
...
}
/**
自定义条件查询:
此处应该是selectAll, selectByUserId, selectByOrgId
selectCascadeByOrgId等
*/
public
Collection select...( ..., Where where ) {
...
}
/**
分页查询:
此处应该是selectAll, selectByUserId, selectByOrgId
selectCascadeByOrgId等
*/
public
Collection select...( ...,
int
fromIndex,
int
size ) {
...
}
|
穷不尽,非常啰嗦,非常苦逼。老实说,很多开发者搞了很多年,总是认为自己重复CURD操作。而权限管理,尤其是查询权限管理,几乎是完全占据了R(read,即select)操作。
如果使用Ralasafe 查询权限API,非常简单。这些DAO的select方法没有了(可以留着,反正不再使用了,不需要再次维护)。DAO的update/delete/add方法继续保留。在你的servlet/action/service层(/表示或者,只要在一个地方调用就够了,我建议在servlet/action层调用)。代码格式如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
QueryResult qr=Ralasafe.query( Constants.SOME_QUERY_PRIVILEGE, userId, fromIndex, size );
Collection queryBeans=qr.getData();
int
totalCount=qr.getTotalCount();
Collection queryFields=qr.getFields();
Collection readOnlyFields=qr.getReadOnlyFields();
|
所有权限逻辑,都不在代码里面。权限管理逻辑都通过Ralasafe web designer进行在线图形化设计,最后通过保存在策略文件里面。(策略文件是通过Ralasafe web designer设计出来的,无需手工编写。)还可以在线测试!
Posted in 应用实践
|
Tagged 权限管理, 查询权限, 行列级权限管理
|
我今天写英文wiki时候,重现出一个BUG。
当我在定义“业务数据分类”时,定义一个变量——类型是数据查询。弹出的数据查询变量定义页,却无法选择查询。数据查询的drop menu空空如也。
打开firebug一看,错误是:
“NetworkError: 404 /demo/ralasafe/query/queryMng – http://localhost:8080/demo/ralasafe/query/queryMng?oper=loadTree”
这个BUG解决非常简单。主要是1.2版本将ralasafe后缀都添加了.rls。此处应该请求queryMng.rls,而不是queryMng。
修改webcontent/ralasafe/common/queryRef.jsp第58行,修改为:
1
|
asyncUrl:
"../query/queryMng.rls?oper=loadTree"
,
|
非常简单吧!
Posted in 源代码
|
Tagged bug
|
很荣幸宣布Ralasafe开源访问控制(权限管理)中间件 1.2版本于2011年9月14日发布!距离上一版本发布约1.5个月时间,发布频率挺好。
本版本主要实践了社区需求、修改社区报告的BUG,并提高了权限引擎执行效率。本次最大变化是:采用FrontController 模式,把web.xml里面ralasafe配置内容转移到独立配置文件,让开发者集成起来更爽!
Ralasafe开源软件高举宗旨:为开发人员节约更多时间,去陪恋人、家人和朋友
下载文件:
- 基于mysql环境的中文demo
- 基于mysql环境的英文demo
- Ralasafe bianry(无demo)
- Ralasafe source
文档已经WIKI化,欢迎大家指正完善:
- Cookbook
- 配置手册
- 开发实践
Posted in 下载, 版本计划
|
Tagged 1.2, ralasafe, 下载, 权限管理
|
引子
今天在QQ群里面几位使用Ralasafe的人讨论:把ralasafe集成到自己的开发项目,但不敢对ralasafe进行改动。
就如何使用开源软件,又如何平衡自己的个性需求,很多人存在疑惑。就此BLOG,我简单谈谈自己的看法,供大家批评讨论。
我们应该这么做
个性化需求肯定要被实现——这点不能否认!实现方式有几种:
- 你认为该需求不够普遍,那么你就要自行实现。
- 可以稍微变通,使用开源的共用需求得到实现,然后自行定制部分代码(稍后谈如何定制代码)
- 你认为该需求非常普遍,应该集成到开源软件里面去。你应该这么做:
- 提交需求报告,ralasafe需求报告提交地址。当前通过该地址提交的需求大部分都被实现,当然他们是好需求
- 提交到社区,供社区讨论,呼吁更多社区呼声,尤其在开源软件发起人不大认可该需求的情况下,非常管用。人无完人,开源软件作者也是,你也是。所以,把问题公开,引起更多讨论
- 你如果能够提供解决方案的话,该需求实现速度会被加快。你也无意中对开源软件做了贡献,恭喜你!
如何自定制
这是个技术活,但我不大赞同采用完全的技术态度对待。从经济态度来看,使用开源软件你已经节约了很多成本,所以做些定制还是非常值得的。
一般情况下来说,如果是我来定制,我会采取这样的原则:
- 尽量不改动java程序代码,尤其是核心类代码。我更愿意自行编写新的类,采用组合、适配器等模式来实现新功能。最近在另外项目使用jsoup,我就是这么做的
- 页面/css等代码,我是非常大胆改动。ralasafe站点我就对theme大刀阔斧去干!
- 最后一点很重要:不要顾忌升级不兼容带来的痛苦,请享受写代码的快乐!
总之,你的需求要不自己实现,享受每次升级带来的麻烦和快乐;要不放入开源社区,供大家讨论,加入开源软件。只要社区活跃、社区方向不会变,所有讨论都会带来意想不到的好处!是的,我是相信了!
写的很没有技术性吧,哈哈,这就是我的文字风格~
Posted in 社区建设
|
Tagged 定制化, 开源
|
Ralasafe爱好者BjFantasy通过SVN提交需求(编号3401119):
目前通过ralasafe的控制台,全部都是配置好的排序,不能动态排序,希望可以在CustomizedWhere里面,能够设置order by 条件,实现动态排序的功能。
此需求非常好。很多情况下,用户在界面点击列表的某个列进行排序,而不使用事先在查询策略里面定义好的排序。
此需求已经实现,并提交到SVN。我只修改org.ralasafe.entitle包里面的CustomizedWhere和Query代码就完成了。当CustomziedWhere带有order by 条件时,如果原查询策略里面没有order by条件,使用该order by条件;如果原查询策略里面有order by条件,原有的order by条件将在本次会话请求中被“屏蔽”,也就是不选用原有的order by条件。
以下是ralasafe demo示例:
在org.ralasafe.demo.servlet.EmployeeServlet里面添加如下代码,实现按照员工姓名增序。
1
2
3
4
|
CustomizedWhere where=
new
CustomizedWhere();
where.addAscOrderBy(
"name"
);
Collection employees = WebRalasafe.query(req, Privilege.QUERY_EMPLOYEE,where);
|
如果要实现逆序,使用:
1
|
where.addDescOrderBy(
"name"
);
|
如果要多列排序,继续调用add方法即可。如:
1
2
|
where.addAscOrderBy(
"name"
);
where.addDescOrderBy(
"departmentId"
);
|
注:和其他CustomizedWhere方法一样,传入的参数都是javabean属性,而不是数据库列名称。这样更好实践ORM,在业务层使用业务模型对话,而不是数据模型对话。