锁定老帖子 主题:请问这样的细粒度权限能否用acegi实现?
该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2006-01-06
我弄错了。其实还是用threadlocal。
对了,这个资源和role的mapping难道只能写在配置文件/annotation里面吗?这些都是静态的,有没有动态支持?比如把这个mapping存在数据库里面? |
|
返回顶楼 | |
发表时间:2006-01-06
ajoo 写道 我弄错了。其实还是用threadlocal。
对了,这个资源和role的mapping难道只能写在配置文件/annotation里面吗?这些都是静态的,有没有动态支持?比如把这个mapping存在数据库里面? 这个acegi自己还是没有提供,官方说法是认为这个安全配置应不会时时变化,但是这显然不合理。动态资源配置有大大已经说过了,请详见 http://forum.iteye.com/viewtopic.php?t=17538 |
|
返回顶楼 | |
发表时间: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%' ----------------------------------- |
|
返回顶楼 | |
发表时间:2006-01-06
楼上的方法,当运行期数据库里面的配置改变的时候acegi里面的配置信息是不会改变的。这就涉及到更复杂的问题,请看FeiiXXXX的那个帖子,说得比较全面。
|
|
返回顶楼 | |
发表时间:2006-01-06
差沙 写道 楼上的方法,当运行期数据库里面的配置改变的时候acegi里面的配置信息是不会改变的。这就涉及到更复杂的问题,请看FeiiXXXX的那个帖子,说得比较全面。
在Feiing的文章中写到: ---------- 实现采用 EhCache 缓存资源权限配置, 这样如果资源权限数据发生变化, 可以 flush Cache 从数据库重新读取 ------------- acegi 也是通过EhCache 缓存用户权限信息,所以当运行期数据库里面的配置改变的时候可以update cache使acegi的配置信息和DB一致。参见: net.sf.acegisecurity.providers.dao.cache.EhCacheBasedUserCache BTW:个人认为Feiing的解决方法有点太麻烦了。 |
|
返回顶楼 | |
发表时间: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 的关系, 它就不够用了 |
|
返回顶楼 | |
发表时间: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相关的东西 |
|
返回顶楼 | |
发表时间: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 |
|
返回顶楼 | |