论坛首页 Java企业应用论坛

webwork2 action和Spring结合的两种方式

浏览 34791 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2004-12-19  
Readonly 写道
偶是这样做的:

权限判断提供一个service, 这个service定义在spring里面:
public interface SecurityService {
    public boolean hasPermission(UserLogin userLogin, String permission);;
}



WebWork的action如果需要进行权限判断, 那么implements一个mark接口(Protected), 实现hasPermission方法:
public class BaseAction extends ActionSupport implements Protected {
    public boolean hasPermission(); {
        return true;
    }
}


用到SecurityService的action, 则采用ext-ref注入:

public class BaseAdminAction extends BaseAction {   
    public boolean hasPermission(); {
        return securityService.hasPermission(userLogin, "ADMIN");;
    }
}



在这儿跟帖似乎另开一个话题比较好了

这个帖子本来是讨论webwork与spring的集成的,但看到readonly的这个权限的简单描述,则比较想了解一下readonly在这种以Action为原子操作(视角不同,有不的描述,对于多个逻辑操放在同一个action中的作法,我不是很赞同,特别是在struts中表现得比较明显,虽然防止了action数量的过度膨胀,但似乎有背于action的原意,我还是觉得一个action完成一个单纯的操作[方法]比较清晰)的权限控制中,是如何操作的,不知能否展开说一下实现思路,比如有一个CreateUserAction,我需要对执行此action的用户有一个权限的验证,按readonly的说法,首先implements一个Protected 接口,这样可能是有一个inteceptor 来做权限的验证,如果发现action instance of Protected ,则一步验证是否此用户有执行此action的权限(比如用户登录时,就把此用户的相关premission放入session中),我比较感兴趣的是后台对此类权限的管理方式,是如何将某个权限子对应到某个action上的,是在Action里定义一个唯一字串来对应此action么?也就是说  比如   userSec1====>CreateUserAction, userSec2=====>DeleteUserAction,这些userSec1*,就是我说的权限子了,如果某个action对应的权限子在用户的权限子列表中,则说明此用户具体执行此action的权限,这样也就可以在后台通过此权限子的操作来完成权限的分配等一系列工作。。。。我不知道大家是实际中是如何实现相关的权限管理分配的,我希望讨论的时候能够多讲一 些细节,对于user--group--role的大方面的笼统的论述,因为讨论得比较多,虽然对此比较了解了,但对于具体如何在代码实现级别上,如何完成对此类action(或者DAO或者Service中的方法)的权限对应,以实现相应的权限分配则讨论得比较少。希望大家展开讨论一下。。。。
0 请登录后投票
   发表时间:2004-12-20  
ruby 写道

在这儿跟帖似乎另开一个话题比较好了

不需要新开贴了,偶具体的做法和你说的是一样的,用一个Interceptor
public class PermissionInterceptor implements Interceptor {
    public static final String NOPERMISSION = "nopermission";

    public String intercept(ActionInvocation invocation); throws Exception {
        Action action = invocation.getAction();;
        if(action instanceof Protected); {
            if(!((Protected); action);.hasPermission(););{
                return NOPERMISSION;
            }
        }
        return invocation.invoke();;
    }

}

所有权限检查失败的,都用同一个global-result:
    <global-results>
        <result name="nopermission" type="freemarker">nopermission.ftl</result>
    </global-results>


偶在这里只是把permission这个对象用String来表示,比果用户需求的权限控制是粗粒度的,那么偶就是只用一个String
public class BaseUserAction extends BaseAdminAction {
    public boolean hasPermission(); {
        return securityService.hasPermission(userLogin, "MAINTAIN_USER");;
    }
}


如果是细粒度的,那么分开CRUD(create, read, update, delete),写不同的"CREATE_USER", "UPDATE_USER"......

至于你说的SecurityService.hasPermission(User user, String permission)这个接口怎么实现,是你系统应用的事情。你可以用简单的一个Map就搞定,也可以用复杂的user-group-role-permission来解决,不同的系统甚至还可能需要根据组织结构的关系来判断权限,这些是没有什么通用解决方法的。脱离具体的应用去讨论这些东西往往就是一陀一陀的,实在无聊得紧。

另外,如果你觉得这个接口看起来不爽,大可以改成你想要的样子,如用ACL来解决等等。但是用webwork的拦截器想法来做权限检查是差不多的。
0 请登录后投票
   发表时间:2004-12-24  
Readonly 写道
update一下, webwork的email list上有人说用autowire, 偶试用了一下, 比原先的external-ref方式简单多了:
ComponentAutowireInterceptor:


readonly,我这两天一直在捉摸你这个update的新方法,一直没有明白,
按照你这种方法,还需不需要在Spring里配置Action? 或是在 xwork.xml
里配置external-ref? 简单在哪里了?

能不能给我讲讲。谢谢!
0 请登录后投票
   发表时间:2004-12-24  
http://forum.iteye.com/viewtopic.php?t=9718

check out jert 项目

Quake Wang的做法就是抄这个autowire。

你不需要在spring里配置action,也不需要在xwork.xml里面配置external-ref。只要保证action引用的东东和spring里面同名就能够auto wire by name了。
0 请登录后投票
   发表时间:2004-12-24  
哈哈!谢谢ReadOnly,真的可以呢!

我笨4了,其实我按照你的方法实现以后,一直试不通,后来发现在Action里定义的bean的名字和Spring里的不一样,然后重构以后,天真的会以为get和set的函数命也随着改过来了,可一直不行,跟踪进去,发现autowire时候每次得到的fieldNameList都是空的。

今天经你指点,看了Jert以后,发现实现是完全一样的,仔细检查,才发现了这个问题。真不好意思。

我很疑惑,这两天我可谓看遍了关于Spring和xwork集成这个问题的文章,这个方法这么方便,为什么一片文章也没有提及呢?

而这个方法,用默认的名称autowire,会不会导致,本不想注入的对象被注入,从而产生隐含的问题呢?

不论如何,谢谢你的指点!
0 请登录后投票
   发表时间:2004-12-30  
withwind 写道


而这个方法,用默认的名称autowire,会不会导致,本不想注入的对象被注入,从而产生隐含的问题呢?



同问
0 请登录后投票
   发表时间:2004-12-30  
你不会自己去看源代码吗?
0 请登录后投票
   发表时间:2005-01-03  
使用SpringObjectFactory的时候,好像validation就和原来的调用方式不同了 ----我的validation结果没被调用

还在研究中

使用external-ref的方式好像没这问题,就是写

&lt;external-ref name="xxxManager"&gt;xxxManager&lt;/external-ref&gt;

要多写一些...
0 请登录后投票
   发表时间:2005-01-03  
withwind 写道

而这个方法,用默认的名称autowire,会不会导致,本不想注入的对象被注入,从而产生隐含的问题呢?

会的,但是在实际使用中会遇到么?举个例子说明一下?
0 请登录后投票
   发表时间:2005-01-20  
请教各位大牛,对于autowire我有两个问题:
1 对于xworks拦截器中的bean可以用spring注入吗?
2 单元测试如何写?
0 请登录后投票
论坛首页 Java企业应用版

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