论坛首页 Java企业应用论坛

请问这样的细粒度权限能否用acegi实现?

浏览 48276 次
该帖已经被评为精华帖
作者 正文
   发表时间:2006-01-06  
我弄错了。其实还是用threadlocal。

对了,这个资源和role的mapping难道只能写在配置文件/annotation里面吗?这些都是静态的,有没有动态支持?比如把这个mapping存在数据库里面?
0 请登录后投票
   发表时间:2006-01-06  
ajoo 写道
我弄错了。其实还是用threadlocal。

对了,这个资源和role的mapping难道只能写在配置文件/annotation里面吗?这些都是静态的,有没有动态支持?比如把这个mapping存在数据库里面?


这个acegi自己还是没有提供,官方说法是认为这个安全配置应不会时时变化,但是这显然不合理。动态资源配置有大大已经说过了,请详见
http://forum.iteye.com/viewtopic.php?t=17538
0 请登录后投票
   发表时间:2006-01-06  
ajoo 写道
我弄错了。其实还是用threadlocal。

对了,这个资源和role的mapping难道只能写在配置文件/annotation里面吗?这些都是静态的,有没有动态支持?比如把这个mapping存在数据库里面?


摘自:
实战Acegi:使用Acegi作为基于Spring框架的WEB应用的安全框架
原文地址:
http://www.blogjava.net/youlq/archive/2005/12/06/22678.html
-----------------------------------
缺省情况下MethodSecurityInterceptor的objectDefinitionSource属性是通过 net.sf.acegisecurity.intercept.method.MethodDefinitionSourceEditor来设置的。 MethodDefinitionSourceEditor只支持属性配置文件的格式(同filterInvocationInterceptor的 objectDefinitionSource属性),而实际情况中,由于业务方法比较多,显然配置信息存放在数据库中比较好。因此,我们通过注册一个 CustomEditorConfigurer来修改MethodDefinitionSource类型属性的对应读取类。配置如下: 
<bean id="customEditorConfigurer" class="org.springframework.beans.factory.config.CustomEditorConfigurer">
<property name="customEditors">
<map>
<entry key="net.sf.acegisecurity.intercept.method.MethodDefinitionSource">
<bean class="sample.util.DataSourceMethodDefinitionSourceEditor">
<property name="jdbcTemplate"> <ref bean="jdbcTemplate"/> </property>
</bean>
</entry>
</map>
</property>
</bean>

DataSourceMethodDefinitionSourceEditor根据以下SQL读取业务方法安全配置信息: 

select authority,PROTECTED_RES from authorities where AUTH_TYPE='FUNCTION' and authority like 'AUTH_FUNC_ContactManager%'


-----------------------------------
0 请登录后投票
   发表时间:2006-01-06  
楼上的方法,当运行期数据库里面的配置改变的时候acegi里面的配置信息是不会改变的。这就涉及到更复杂的问题,请看FeiiXXXX的那个帖子,说得比较全面。
0 请登录后投票
   发表时间:2006-01-06  
差沙 写道
楼上的方法,当运行期数据库里面的配置改变的时候acegi里面的配置信息是不会改变的。这就涉及到更复杂的问题,请看FeiiXXXX的那个帖子,说得比较全面。


在Feiing的文章中写到:
----------
实现采用 EhCache 缓存资源权限配置, 这样如果资源权限数据发生变化, 可以 flush Cache 从数据库重新读取
-------------
acegi 也是通过EhCache 缓存用户权限信息,所以当运行期数据库里面的配置改变的时候可以update cache使acegi的配置信息和DB一致。参见:
net.sf.acegisecurity.providers.dao.cache.EhCacheBasedUserCache

BTW:个人认为Feiing的解决方法有点太麻烦了。
0 请登录后投票
   发表时间:2006-01-06  
youlq 写道
差沙 写道
楼上的方法,当运行期数据库里面的配置改变的时候acegi里面的配置信息是不会改变的。这就涉及到更复杂的问题,请看FeiiXXXX的那个帖子,说得比较全面。


在Feiing的文章中写到:
----------
实现采用 EhCache 缓存资源权限配置, 这样如果资源权限数据发生变化, 可以 flush Cache 从数据库重新读取
-------------
acegi 也是通过EhCache 缓存用户权限信息,所以当运行期数据库里面的配置改变的时候可以update cache使acegi的配置信息和DB一致。参见:
net.sf.acegisecurity.providers.dao.cache.EhCacheBasedUserCache

BTW:个人认为Feiing的解决方法有点太麻烦了。


UserCache 只是 User 与  Role 的缓存, 如果用户需要实时更改 Role 与 Resource 的关系, 它就不够用了
0 请登录后投票
   发表时间:2006-01-25  
robbin 写道
引用
使用Struts/Spring的话,可以使用Spring的拦截器。不过这里面我有一个很大的疑问:就是Spring的拦截器怎么去拿到 HttpSession里面的用户信息,从而拿到role进行权限判别?Webwork的拦截器通过ThreadLocal方式的 ActionContext提供了不依赖Servlet容器的相关信息,但是Spring没有提供相关设施,兴许Spring有某个提供了 ServletContext的回调接口(我不熟悉spring MVC所以只是猜测),只要拦截器实现该接口就可以得到ServletContext,从而拿到HttpSession。然而这样的方式也和 Servlet API偶合了,无法脱离容器进行单元测试(必须用Mock),还是不如Webwork方便。

引申一步,对于现在AJAX方式的分布式调用,都是跳过Web层直接访问业务bean的,这时候都需要获得HttpSession,进行身份识别,我不知道大家是怎么做的。


自问自答一把。可以自己写一个ServletFilter,把Webwork那些对应ActionContext相关的代码拷贝过来,在ServletFilter里面初始化和组装,随后就可以在Spring拦截器里面用Webwork那种方式使用request,session,context了。不过还是不知道大家是怎么处理的?


我是用了一个ServletFilter在web容器启动时加载一个singleton的context,也就是一行代码:
SessionContext.setCurrentContext((HttpServletRequest); request,
				(HttpServletResponse);response);; 


SessionContext使用ThreadLocal:

.......
private static ThreadLocal tl = new ThreadLocal();;

......

static public void setCurrentContext(HttpServletRequest request,
			HttpServletResponse response); {
		SessionContext sessionManager = getCurrentContext();;
		if (sessionManager == null); {
			log.info("Create a new SessionContext");;
			sessionManager = new SessionContext(request, response);;
			
			tl.set(sessionManager);;
		} else {
			log.info("Reuse SessionContext");;
			sessionManager.setRequest(request);;
			sessionManager.setResponse(response);;
		}
	}
......


这样在services层中就可以通过SessionContext直接从httpsession中获得数据
我是打算试一下ajax才弄了这么个东西,不熟悉ajax这样的远程调用方式,还没找到session的最佳处理方式,不知各位是如何处理的?

至于在spring中,只要将controller从MultiActionController继承过来,那么只要:
ApplicationContext ctx = getApplicationContext();
就可以取得压入servletcontext的ApplicationContext
在我的controller中,代码大概是这样:
ApplicationContext ctx = getApplicationContext();;

		UserManager userManager = (UserManager); ctx.getBean("userManager");;

		User user = userManager.login(userName, userPassword);;

		if (user == null);
			return new ModelAndView("login_failed");;
		else {
			req.getSession();.setAttribute("User", user);;
			return new ModelAndView("login_success");;
		}

controller只做了3件事:
1.从httprequest中取得参数,然后分派给services层的对象
2.根据services层的对象处理结果分派给不同的视图
3.状态保持
权限控制部分依然是和servlet api解耦的,也是容易测试的.

spring的mvc设计是分离的最干净的最灵活的,只处理web相关的东西
0 请登录后投票
   发表时间:2006-03-08  
robbin 写道
lllyq 写道
引用
下载了你的开源框架,没找到你在哪里用AOP加入role的代码。权限确实适合用AOP去解决。

bba96-security是我另一个开源项目,可能也会加到bba96里面去。其实也很简单,只是用到bba96的query接口,然后自己定义一套security的接口给具体项目的role, user, group, resource, permission,只有一个securityManager跟permissionInterceptor是实现类,可以很方便的实现数据权限,以及权限的允许,限制,包含,还可以通过多种方式(自身冗余字段/连接表字段/子查询)让user对resource在group关系上的权限继承,所需要做的只是让resource实现不同的接口,对resource在department/type等其他关系的,就只能同过数据权限,就不能继承了(当然实现起来也可以,但是复杂度更高),这样用AOP控制下来,你就发现在权限控制方面是很自由的了。只用维护一个permission表,就可以随意对resource进行细到每个字段,甚至是他的关联字段的控制。


acegi是很好,通用性也拌住了自己的脚,ACL也不是多么好的模型,用起来不会有让你有自由的感觉,不值得花太多功夫下去。不知道acegi有没有query接口,可以让用户实现,而它对于这个query接口来进行AOP的权限控制,我觉得这才是根本之道。


那就等着看你完整的框架代码了。bba96简单浏览了一遍,感觉还是很不错的。

已经发布,不过文档还不齐,还算不上权限框架,算是权限模块吧,依赖接口。有待扩展
http://forum.iteye.com/viewtopic.php?t=16210
0 请登录后投票
论坛首页 Java企业应用版

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