论坛首页 Java企业应用论坛

[转载]实战Acegi

浏览 34229 次
该帖已经被评为精华帖
作者 正文
   发表时间:2006-08-03  
引用

为了满足acegi的要求,必需先loadObject


补充一下,acegi在由domainobject 构造AclObjectIdentity应该没有到数据库中去load
但默认的实现要求domainobject有getId方法(幸好我一直这么做)

另外service中delete(domainobject )而不是delete(id)也算是一个小约定吧

但这两个侵入程度还是可以“忍受的”,何况前者还可以扩展


就是集合后处理分页的虎牙子一直让俺头疼~~~
0 请登录后投票
   发表时间: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' 啊。
0 请登录后投票
   发表时间: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)
。。。。。。。。。。。
0 请登录后投票
   发表时间:2006-08-22  
啥叫虎牙子?

现在的年轻人讲话都听不懂了。代沟。

-------
问:你与你父母经常交流吗?你们有没有代沟?想不想填平?怎样填平?
答:当然有代沟。没有代沟的时代是木发展的时代。为什么要填平?要么你被父母同化, 要么父母被你同化。你以为填代沟是填阴沟啊?
0 请登录后投票
   发表时间:2006-08-22  
引用

啥叫虎牙子?

现在的年轻人讲话都听不懂了。代沟。

俺的意思是检索出来的当前页数据会被acegi过滤掉
造成第一页10条,第二页8条,第三页9条数据的情况
如果不将权限信息写在where中,不太好解决的样子。。。


btw:

布哥儿,你才29年华,风华正茂,何必言老。。。
0 请登录后投票
   发表时间: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中已经存在了这些记录,可以直接返回。
0 请登录后投票
   发表时间: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,为了计算总页数,很显然需要计算出总记录数,为了计算总记录数,势必把所有的记录遍历一把,逐个过滤,对于数据量稍大,这显然不可接受。
0 请登录后投票
   发表时间:2006-08-23  
引用

具有相同Role组合(and/or 权限相关业务规则)的所有User,看作是User Group。
为每个User Group根据权限数据和规则做数据映射,比如每天晚上做一次。


acegi的acl中分派权限是以domainobject为中心的,如果分组的化按domainobject分组比较自然,但这样的话会分出和domainobject数量可比的组数来,感觉不太好。。。。。。
0 请登录后投票
   发表时间: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会过长
对数据排序显得非常的困难
0 请登录后投票
   发表时间:2006-08-24  
问一下如果要动态的配制url访问权限怎么设啊。
要把url也添加到数据库。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics