> 可以参见 seraph
> http://opensource.atlassian.com/seraph

看了他的结构,也是用filter来实现,也downcast
SecurityFilter.doFilter中用了Chain of respo..模式
通过合并一组SecurityService.getRequiredRoles(),然后判断
isUserInRoles

似乎是只有模式,没有效率的方案

不过还是理清了一些想法,:)
谢谢

在(OReilly)_Programming_Jakarta_Struts中的一个章节,专门讲了对struts的扩展,他提到:可以对RequestProcessor的processPreprocess()进行重载……一个可以替代的方法是filter,但是filter的一个缺点是他过滤得太早了,以至于无法方便的访问许多struts API……
我通过实践,觉得在RequestProcessor里进行权限判断,能够实现你的要求。

> filter概念实际就是Proxy模式实现。
>

不会吧?

不会吧,那样判断权限,每次都要对数据库来操作呀。
我现有一个办法,就是在服务器启动时,用一类从数据库里生成xml document 对象到容器里,通过xpath 来访问document,这样提高了性能和速度。
如果数据库更新了,调用一个触发类更新那个document 对象。。。
不知可否,正在试中.....
请多多提出意见.

> 一、没有owner的概念,比如要让用户对自己创建的资源有编?> 权,怎么办?……
>
> 二、PermissionFilter,如果设为过滤"/*",又是根目录下的
> 钅浚tomcat启动时也会调用doFilter方法,这不是我想要的
>
> 三、PermissionFilter中,downcast
> ServletRequest到HttpServletRequest,会不会有隐患?上传
> 募ümutipart
> form提交的request会不会转换错?还有没有其他不能cast的?> 况?
>
> 四、用资源类型、操作类型能唯一确定一个功能吗?
>
个人观点:
1 我认为owner属于细粒度的权限,可以把它归到业务逻辑中去。
2 用Filter去实现,不如写一个Action的子类 AuthorityAction,用它进行权限控制,所有需要保护的Action都继承自它。AuthorityAction 通过接收的资源类型、操作类型以及Session中的user进行权限判断。这样就不会有你那样的烦恼。
3 不会有隐患,我以前就那么做过。上传文件时也没有问题。
4 资源+操作当然要确定成唯一的功能。

“透明的权限控制”不应该局限在Web层。那样的话似乎不太符合层次架构的思想。我想AA(Authentication & Authorization)是否应该作为单独的一层考虑。
我也尝试过设计一下,不过还是无法跳出传统的圈子。最大的难点就是解除Model对AA的依赖。如果有一个方法可以动态的为Model建立一个Proxy就好了。好像JDO的增强技术,不过那是静态的。

对动态Proxy有一点突破,请参见javaresearch.org的j2ee专栏

推荐:

WebAuth 是一款提供基于web的J2EE应用认证模块,该项目可以作为一个单独的模块方便地整合到web应用中,提供各种登陆认证功能,从而减少这方面的开发时间,支持MYSQL和ORACLE数据库

http://sourceforge.net/projects/web-auth

再补充,建议使用AOP来实现权限控制,AOP本身就是透明的。