锁定老帖子 主题:[转载]实战Acegi
该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2006-08-03
引用 为了满足acegi的要求,必需先loadObject 补充一下,acegi在由domainobject 构造AclObjectIdentity应该没有到数据库中去load 但默认的实现要求domainobject有getId方法(幸好我一直这么做) 另外service中delete(domainobject )而不是delete(id)也算是一个小约定吧 但这两个侵入程度还是可以“忍受的”,何况前者还可以扩展 就是集合后处理分页的虎牙子一直让俺头疼~~~ |
|
返回顶楼 | |
发表时间:2006-08-22
为什么我把那个示例项目移到我的项目中时总出现:
Error creating bean with name 'contactManagerSecurity' defined in ServletContext resource [/WEB-INF/applicationContext-basic.xml]: Error setting property values; nested exception is org.springframework.beans.PropertyAccessExceptionsException: PropertyAccessExceptionsException (1 errors); nested propertyAccessExceptions are: [org.springframework.beans.TypeMismatchException: Failed to convert property value of type [java.lang.String] to required type [net.sf.acegisecurity.intercept.method.MethodDefinitionSource] for property 'objectDefinitionSource'; nested exception is java.lang.IllegalArgumentException: Class 'sample.service.IContactManager' not found] PropertyAccessExceptionsException (1 errors) 呢? 我search 整个 项目根本没地方有'sample.service.IContactManager' 啊。 |
|
返回顶楼 | |
发表时间:2006-08-22
现在我建了个包有'sample.service'
然后把IContactManager放到此处, 上面异常没有了,但出现如下异常: [WARN,Configurator,main] No configuration found. Configuring ehcache from ehcache-failsafe.xml found in the classpath: file:/F:/program/acegi88/work/loader/ehcache-failsafe.xml [ERROR,XmlConfigurationProvider,main] Action class [com.ryandaigle.bbl.web.actions.GetLeaguesAction] not found, skipping action [viewLeagues] java.lang.ClassNotFoundException: com.ryandaigle.bbl.web.actions.GetLeaguesAction at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1340) at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1189) at com.opensymphony.util.ClassLoaderUtil.loadClass(ClassLoaderUtil.java:104) 。。。。。。。。。。。 |
|
返回顶楼 | |
发表时间:2006-08-22
啥叫虎牙子?
现在的年轻人讲话都听不懂了。代沟。 ------- 问:你与你父母经常交流吗?你们有没有代沟?想不想填平?怎样填平? 答:当然有代沟。没有代沟的时代是木发展的时代。为什么要填平?要么你被父母同化, 要么父母被你同化。你以为填代沟是填阴沟啊? |
|
返回顶楼 | |
发表时间:2006-08-22
引用 啥叫虎牙子? 现在的年轻人讲话都听不懂了。代沟。 俺的意思是检索出来的当前页数据会被acegi过滤掉 造成第一页10条,第二页8条,第三页9条数据的情况 如果不将权限信息写在where中,不太好解决的样子。。。 btw: 布哥儿,你才29年华,风华正茂,何必言老。。。 |
|
返回顶楼 | |
发表时间:2006-08-22
1.
如果不觉得麻烦,并且不在乎空间。 这个问题可以采用临时映射表(or 数据仓库)来解决。 具有相同Role组合(and/or 权限相关业务规则)的所有User,看作是User Group。 为每个User Group根据权限数据和规则做数据映射,比如每天晚上做一次。 ref_table display_order real_id 1 1001 2 1004 每次分页显示的逻辑如下 select real_data.*, ref_table.display_order from real_data, ref_table where ref_table.order >= {begin} and ref_table.order <= {end} and real_data.id = ref_table.real_id order by display_order ---- 或者分成两步来做。 select * from ref_table where ref_table.order >= {begin} and ref_table.order <= {end} 用代码拼出来一个 real id list. 并且拼出来一个 { real id -> display order } map。 select * from real_data where id in ( {real id list} ); 获得的结果列表,根据 id 查找{ real id -> display order } map,进行正确的排序。 这些工作可以用一个通用的类似于ORM Rountine的通用代码来统一处理。 ---- 上述的ref_table是每个User Group一个。 如果要对应多个User Group,需要加入一个 user group id 字段。 --------------------------------------------------------------------- 2. 假设每页10条数据。 用户需要 21 - 30 区间的记录。 假设只有2条符合权限,那么继续选取 31 - 30 区间的记录。 这么下去,直到满了10条为止。 可以采用分页预取来缓解多次查询数据库的负担,比如,有Query Cache的情况。 用户需要 21 - 30 区间的记录。 ORM程序从数据库选出 1 - 100区间的记录,从中选出21 - 30 区间的记录给用户程序。 如果用户还需要31 - 30 区间的记录,这时候,ORM的Query Cache中已经存在了这些记录,可以直接返回。 |
|
返回顶楼 | |
发表时间:2006-08-22
buaawhl 写道 1.
如果不觉得麻烦,并且不在乎空间。 这个问题可以采用临时映射表(or 数据仓库)来解决。 具有相同Role组合(and/or 权限相关业务规则)的所有User,看作是User Group。 为每个User Group根据权限数据和规则做数据映射,比如每天晚上做一次。 ref_table display_order real_id 1 1001 2 1004 每次分页显示的逻辑如下 select real_data.*, ref_table.display_order from real_data, ref_table where ref_table.order >= {begin} and ref_table.order <= {end} and real_data.id = ref_table.real_id order by display_order ---- 或者分成两步来做。 select * from ref_table where ref_table.order >= {begin} and ref_table.order <= {end} 用代码拼出来一个 real id list. 并且拼出来一个 { real id -> display order } map。 select * from real_data where id in ( {real id list} ); 获得的结果列表,根据 id 查找{ real id -> display order } map,进行正确的排序。 这些工作可以用一个通用的类似于ORM Rountine的通用代码来统一处理。 ---- 上述的ref_table是每个User Group一个。 如果要对应多个User Group,需要加入一个 user group id 字段。 --------------------------------------------------------------------- 2. 假设每页10条数据。 用户需要 21 - 30 区间的记录。 假设只有2条符合权限,那么继续选取 31 - 30 区间的记录。 这么下去,直到满了10条为止。 可以采用分页预取来缓解多次查询数据库的负担,比如,有Query Cache的情况。 用户需要 21 - 30 区间的记录。 ORM程序从数据库选出 1 - 100区间的记录,从中选出21 - 30 区间的记录给用户程序。 如果用户还需要31 - 30 区间的记录,这时候,ORM的Query Cache中已经存在了这些记录,可以直接返回。 方法二在实际应用中有问题,实现分页,一般都需要提供总页数,比如需要实现javaeye这样的分页功能 1,2,3。。。49,50,为了计算总页数,很显然需要计算出总记录数,为了计算总记录数,势必把所有的记录遍历一把,逐个过滤,对于数据量稍大,这显然不可接受。 |
|
返回顶楼 | |
发表时间:2006-08-23
引用 具有相同Role组合(and/or 权限相关业务规则)的所有User,看作是User Group。 为每个User Group根据权限数据和规则做数据映射,比如每天晚上做一次。 acegi的acl中分派权限是以domainobject为中心的,如果分组的化按domainobject分组比较自然,但这样的话会分出和domainobject数量可比的组数来,感觉不太好。。。。。。 |
|
返回顶楼 | |
发表时间:2006-08-23
说说我的方法 ,我实际上采用的和buaawhl的第一种方法比较象.当时也考虑到ACEGI的后拦截过滤分页会比较困难.于是采用的前拦截
在acl表里增加一个className字段,里面放上PO的类名,这样可以缩小数据查询范围.实际在读取集合时,先读取acl表里的权限记录,根据一定业务规则获得对user的real id list ,排序 然后拦截实际DAO方法,动态改变SQL成select * from real_data where id in ( {real id list} )的形式,这样就OK了,分页实际是对real id list 的'分页'.比如说取第10条到20条,实际是取real id list 的第10条到20条来动态改变SQL 缺点也很明显:如果不分页而数据量很大,则SQL会过长 对数据排序显得非常的困难 |
|
返回顶楼 | |
发表时间:2006-08-24
问一下如果要动态的配制url访问权限怎么设啊。
要把url也添加到数据库。 |
|
返回顶楼 | |