论坛首页 Java企业应用论坛

关于权限的思路

浏览 7757 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-04-20  
现在要设计一个很简单的权限模块。使用的环境是struts2+spring。
需求是在调用每一个业务方法之前,都做一个权限的检查。因为涉及到不是若干方法,是所有方法,而且每个方法的检查基本上是根据用户的权限判断是否有权调用这个方法,所以,打算使用AOP,而不使用油漆工模式对方法包装。
具体的思路是这样:
1.每个方法其实就对应一个权限。所以打算定义一个Annocation类型,里面只有一个属性opid,值为对应权限表中的operationId.
2.对所有方法进行拦截。但是希望在拦截器中知道当前拦截的是哪个方法。并且能访问到这个方法注解中的opid
然后在拦截器中判断用户的权限集合(用户登陆的时候,可以查表放到session里)是否包含opid.如果包含,那么接着执行方法,如果不包含,那么返回
现在的问题是不知道拦截器是用struts2中的呢,还是spring的aop,对于这一块很陌生,希望帮我看一下,最好举个例子。谢谢:)
   发表时间:2007-04-20  
自己顶一下,正在研究struts2中的拦截器,现在还有一个问题就是要确认这种思路对不对。难点是拦截器中能否智能的知道当前被拦截的方法,以及得到这个方法注解中的ogid.
0 请登录后投票
   发表时间:2007-04-21  
顶一下。谢谢
0 请登录后投票
   发表时间:2007-04-21  
Rod教导我们不要重复发明轮子,你的需求已经有非常成熟的开源解决方案。推荐你去了解一下Acegi。

附Springside WIKI上对Acegi的简介:
引用
    Acegi 是Spring Framework 下最成熟的安全系统,它提供了强大灵活的企业级安全服务,如完善的认证和授权机制,Http资源访问控制,Method 调用访问控制,Access Control List (ACL) 基于对象实例的访问控制,Yale Central Authentication Service (CAS) 耶鲁单点登陆,X509 认证,当前所有流行容器的认证适配器,Channel Security频道安全管理等功能。

它提供了多方面的安全控制粒度:

URL 资源访问控制
http://apps:8080/index.htm -> 所有用户可以访问
http://apps:8080/user.htm -> 只给授权用户访问
方法调用访问控制
public void getData() -> 所有用户可以访问
public void modifyData() -> 只有管理员有权限访问
对象实例保护
order.getValue() < $100 -> 所有用户可以访问
order.getValue() > $100 -> 合法的用户可以访问
0 请登录后投票
   发表时间:2007-04-21  
引用
现在的问题是不知道拦截器是用struts2中的呢,还是spring的aop,对于这一块很陌生,希望帮我看一下,最好举个例子。谢谢:)

对于URL请求的权限控制一般采用Filter来实现,对于方法的权限控制一般采用AOP中的around advice来实现。
0 请登录后投票
   发表时间:2007-04-21  
对,这些事情Acegi都能做,而且完全采用AOP方式,不会对业务代码造成侵入。你们既然已经用了Spring,把Acegi用起来就不会很困难了。

详情见《Spring框架高级编程》,不过这本书翻译的太烂,估计你看起来会很痛苦。
罗时飞专门写了一本《敏捷Acegi、CAS--构建安全的Java系统》,也可以找来看看。
http://www.china-pub.com/computers/common/info.asp?id=34401
0 请登录后投票
   发表时间:2007-04-21  
其实我是想用ACEGI,但是被我们老大给否了。认为简单问题复杂化(他们认为ACEGI比较复杂。)。最后谢谢二位。我现在也很为难,只能硬着头皮自己试试。如果annocation实在不成的话,就在每个URL请求后面跟一个对应方法的opid参数吧在struts2中的拦截器中判断一下试试。
0 请登录后投票
   发表时间:2007-04-21  
highriver 写道
其实我是想用ACEGI,但是被我们老大给否了。认为简单问题复杂化(他们认为ACEGI比较复杂。)。最后谢谢二位。我现在也很为难,只能硬着头皮自己试试。如果annocation实在不成的话,就在每个URL请求后面跟一个对应方法的opid参数吧在struts2中的拦截器中判断一下试试。

你们老大认为的简单问题复杂化应该指的是Acegi学习曲线比较复杂吧,不过自己实现方法拦截的功能会带来更大的复杂度,而且不成熟的代码给后续的代码维护带来极大的工作量。退一步说如果要自己实现的话,你采用annotation或是URL请求带OPID参数也是非常ugly的做法,其实不用那么复杂,java的反射机制其实可以通过Method的getDeclaringClass和getName分别取到该方法的类或接口的Class对象和方法名称,再结合你的权限资源表配置同样可以做到对方法级权限的判断。
0 请登录后投票
   发表时间:2007-04-21  
谢谢,lee5593的指教。是呀,资源表中只要有一个字段用来保存方法名称不就可以了吗?呵呵。我早上也是这么想来着。只是这是咱天的贴子。那么下面的问题是我在action中对于每个请求方法做权限控制。其实每个请求方法对应的一个URL,这种情况下,刚才你说对于URL的请求使用FILTER,那么它与struts2的拦截器的主要区别是什么。感觉都是增强。我现在不清楚用哪个好。如何用?再次感谢。
0 请登录后投票
   发表时间:2007-04-21  
struts2的拦截器我没有了解过,不过原理都一样,只是我不太明白你一直是强调基于Action层的方法拦截,其实一个URL请求对应的就是特定Action的一个方法,这时没有必要用方法拦截的手段来实现,直接用Servlet的标准Filter拦截URL就可以了,只有当你要用到基于业务层的方法调用权限控制时,也就是说一个Action方法中会调用多个业务层方法,这样就无法简单地通过URL的拦截来达到这个目的,这时候你才需要考虑用AOP来拦截业务层的方法。这应该是struts2拦截器无法办到的,因为这超出了它关注的范围(只是初步猜想,这需要你自己去证实 )
0 请登录后投票
论坛首页 Java企业应用版

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