陆续有开发者咨询:怎样只使用Ralasafe查询权限的where条件,查询继续使用自己的ORM框架?
我的回答是:鼓励使用Ralasafe的查询权限,不使用你的ORM。当然,使用Ralasafe的where,继续使用你的ORM也是可以的。
原因如下:
- 改动小:使用Ralasafe的查询权限,对你的ORM代码改动小,不需要改动你原来的查询代码。只要在你的web/service层调用Ralasafe查询API即可
- 收益大:权限管理中的数据级查询权限,往往非常复杂。需求有:行级、列级。只给你where条件,能控制行级,但不能控制列级。Ralasafe查询权限可以做到控制列级
下面,我们给出一些代码示例做比较。这是不用Ralasafe,开发者需要编写的查询DAO代码:
/**
查询所有
*/
public Collection selectAll() {
...
}
/**
根据用户id进行查询
*/
public Collection selectByUser( int userId ) {
...
}
/**
根据组织机构进行查询
*/
public Collection selectByOrgId( int orgId ) {
...
}
/**
根据机构层级查询
*/
public Collection selectCacadeByOrgId( int orgId ) {
...
}
需要多少个方法,由权限管理需求的复杂性。权限管理需求越复杂,方法就越多。每个方法,当然都需要开发者人工编写。
其实这些方法是远远不够的,即使不考虑需求变化。很明显少了这样的方法:
- 根据条件进行查询
- 查询总记录条数
- 分页查询
巴拉巴拉,我们是苦命的程序员。又要编写很多DAO方法:
/**
查询记录总数:
此处应该是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层调用)。代码格式如下:
//Ralasafe的分页查询,也有不分页的查询,自定义条件查询
QueryResult qr=Ralasafe.query( Constants.SOME_QUERY_PRIVILEGE, userId, fromIndex, size );
// 查询结果,集合里面的数据类型是开发者自定义的ViewObject(Javabean)
Collection queryBeans=qr.getData();
// 如果完整执行查询,总记录条数,对于分页显示很有用
int totalCount=qr.getTotalCount();
// 当前用户可以查询哪些字段
Collection queryFields=qr.getFields();
// 哪些字段对于当前用户是只读的
Collection readOnlyFields=qr.getReadOnlyFields();
所有权限逻辑,都不在代码里面。权限管理逻辑都通过Ralasafe web designer进行在线图形化设计,最后通过保存在策略文件里面。(策略文件是通过Ralasafe web designer设计出来的,无需手工编写。)还可以在线测试!