论坛首页 入门技术论坛

acegi的objectDefinitionSource为什么可以接受string类型!??

浏览 5034 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-02-28  
今天初步把acegi跑通了,但是有个问题不太明白
<bean id="filterSecurityInterceptor"
		class="org.acegisecurity.intercept.web.FilterSecurityInterceptor">
                  <!-- 验证管理员 -->
		<property name="authenticationManager"
			ref="authenticationManager" />
		<!-- 授权管理员 -->
		<property name="accessDecisionManager"
			ref="accessDecisionManager" />
		<property name="objectDefinitionSource">
			<value>
				CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
				PATTERN_TYPE_APACHE_ANT
				/secured/usermanage/**=ROLE_TEST
				/secured/**=ROLE_USER
			</value>
		</property>
	</bean>

这里配置的objectDefinitionSource为什么配置的时候是个字符串呢,即
CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
				PATTERN_TYPE_APACHE_ANT
				/secured/usermanage/**=ROLE_TEST
				/secured/**=ROLE_USER

我看了一下FilterSecurityInterceptor中的 public void setObjectDefinitionSource(FilterInvocationDefinitionSource newSource) 他接受的参数类型因该是FilterInvocationDefinitionSource这个字符串是怎么转换成FilterInvocationDefinitionSource类型的呢?
   发表时间:2008-03-02  
我晕....看来不做标题党不行啊

0 请登录后投票
   发表时间:2008-03-03  
我对这个问题也很好奇。在网上搜索了一下,找到如下文字:

引用
研究下Aceig的源码,ObjectDefinitionSource的实际作用是返回一个ConfigAttributeDefinition对象,而Acegi Sample 的方式是用MethodDefinitionSourceEditor把xml中的文本Function资源权限对应关系信息加载到MethodDefinitionMap ( MethodDefinitionSource 的实现类 )中, 再组成ConfigAttributeDefinition


见:http://www.springside.org.cn/docs/reference/Acegi4.htm

但Spring/Acegi是在什么时候及如何调用MethodDefinitionSourceEditor的,仍没搞清楚
0 请登录后投票
   发表时间:2008-03-04  
曾经查看Acegi的源码,FilterSecurityInterceptor的objectDefinitionSource属性的类型为FilterInvocationDefinitionSource,猜测Acegi是使用FilterInvocationDefinitionSourceEditor读取配置并赋值给它(objectDefinitionSource)的,因为查看FilterInvocationDefinitionSourceEditor的源码,其中有相关的读取配置的代码。但FilterInvocationDefinitionSourceEditor是在何时及如何被调用的呢?

在Spring的官方论坛中找到一个帖子:http://forum.springframework.org/showthread.php?t=11242&highlight=objectDefinitionSource

其中提到:

引用
The PropertyEditorManager uses three techniques for locating an editor for a given type. First, it provides a registerEditor method to allow an editor to be specifically registered for a given type. Second it tries to locate a suitable class by adding "Editor" to the full qualified classname of the given type (e.g. "foo.bah.FozEditor"). Finally it takes the simple classname (without the package name) adds "Editor" to it and looks in a search-path of packages for a matching class.


PropertyEditorManager是java.beans包中的一个类,难道其中的根据“类型名称+Editor”来查找属性相应的编辑器(姑且这么翻译)的机制是Java早就拥有的?查看JDK中PropertyEditorManager相关的内容,果然找到上面的那段话!

原来是这样!难怪在Spring、Acegi的源码中都找不到注册或调用FilterInvocationDefinitionSourceEditor的代码。我以为这是Spring或Acegi提供的机制,原来是Java的标准机制!

至此可以理解读取配置并给属性赋值的过程大致如下:
1.Spring读取Acegi相关的配置,知道需要把类似

引用
CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON 
                 PATTERN_TYPE_APACHE_ANT 
                 /secured/usermanage/**=ROLE_TEST 
                 /secured/**=ROLE_USER


的内容赋值给bean filterSecurityInterceptor的objectDefinitionSource属性

2.Spring知道filterSecurityInterceptor的objectDefinitionSource属性的类型为FilterInvocationDefinitionSource,查找该类型的编辑器。因为Acegi并未为该类型显式地注册编辑器(查Acegi代码可知),Spring应用上面的规则查到相应的编辑器为FilterInvocationDefinitionSourceEditor

3.Spring实例化FilterInvocationDefinitionSourceEditor,并调用它完成后续的读取配置并给属性赋值的工作
0 请登录后投票
   发表时间:2008-03-05  
movingboy 写道
曾经查看Acegi的源码,FilterSecurityInterceptor的objectDefinitionSource属性的类型为FilterInvocationDefinitionSource,猜测Acegi是使用FilterInvocationDefinitionSourceEditor读取配置并赋值给它(objectDefinitionSource)的,因为查看FilterInvocationDefinitionSourceEditor的源码,其中有相关的读取配置的代码。但FilterInvocationDefinitionSourceEditor是在何时及如何被调用的呢?

在Spring的官方论坛中找到一个帖子:http://forum.springframework.org/showthread.php?t=11242&highlight=objectDefinitionSource

其中提到:

引用
The PropertyEditorManager uses three techniques for locating an editor for a given type. First, it provides a registerEditor method to allow an editor to be specifically registered for a given type. Second it tries to locate a suitable class by adding "Editor" to the full qualified classname of the given type (e.g. "foo.bah.FozEditor"). Finally it takes the simple classname (without the package name) adds "Editor" to it and looks in a search-path of packages for a matching class.


PropertyEditorManager是java.beans包中的一个类,难道其中的根据“类型名称+Editor”来查找属性相应的编辑器(姑且这么翻译)的机制是Java早就拥有的?查看JDK中PropertyEditorManager相关的内容,果然找到上面的那段话!

原来是这样!难怪在Spring、Acegi的源码中都找不到注册或调用FilterInvocationDefinitionSourceEditor的代码。我以为这是Spring或Acegi提供的机制,原来是Java的标准机制!

至此可以理解读取配置并给属性赋值的过程大致如下:
1.Spring读取Acegi相关的配置,知道需要把类似

引用
CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON 
                 PATTERN_TYPE_APACHE_ANT 
                 /secured/usermanage/**=ROLE_TEST 
                 /secured/**=ROLE_USER


的内容赋值给bean filterSecurityInterceptor的objectDefinitionSource属性

2.Spring知道filterSecurityInterceptor的objectDefinitionSource属性的类型为FilterInvocationDefinitionSource,查找该类型的编辑器。因为Acegi并未为该类型显式地注册编辑器(查Acegi代码可知),Spring应用上面的规则查到相应的编辑器为FilterInvocationDefinitionSourceEditor

3.Spring实例化FilterInvocationDefinitionSourceEditor,并调用它完成后续的读取配置并给属性赋值的工作

俺明白了,非常感谢。。。。。
0 请登录后投票
   发表时间:2008-10-07  
我也有类似的疑问, 当时正在看struts2方面的type converter, 也就认为acegi或spring内部用了一个类型转换器,把string类型的信息转为FilterInvocationDefinitionSource类型,往下也没再细想,今天看了这里的解释,明白了.

谢谢!
0 请登录后投票
   发表时间:2008-11-13  
虽然有所不同我则是给那个userDetail的value是一个String给弄糊涂了,而且editor还不用注册,现在明白了,支持一下帖子。
0 请登录后投票
论坛首页 入门技术版

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