`

ldap与Acegi? ----Acegi配置文件解剖

阅读更多
ldap与Acegi? ----Acegi配置文件解剖

这两个之间没什么必然的联系吧?ldap不熟悉,Acegi更是不熟悉.呵呵,这两个再搅和在一起就乱了.

ldap好像是与数据库连接相关的一个东东,那它与现在常见的数据库连接JDBC有什么区别?与JNDI呢?与这两个比又有什么优势?这个优势又怎么暗合了Acegi的需求?

对于Acegi只知道它是与Spring协作很好的一个Security框架,先不说Security别的方面,现在只看它如何管理登录这块,登录肯定是要访问数据库,那么在Acegi的配置文件中又是怎么来体现管理这个访问数据库的呢?

仔细研究项目中定义的applicationContext-acegi-secutiry.xml文件,这里面配置了如下的几个Bean:
 1,filterChainProxy -->org.acegisecurity.util.FilterChainProxy
    property: filterInvocationDefinitionSource,其值有:
        CONVERT_URL_TOLOWERCASE_BEFORE_COMPARISON
        PATTEN_TYPE_APCHE_ANT

        /**=httpSessionContextIntegrationFilter,        logoutFilter,authenicationProcessingFilter,securityContextHolderAwareRequestFilter,rememberMeProcessingFilter,anonymousProcessingFilter,exceptionTranslationFilter,filterInvocationInterceptor

        ?**
        这么一长串是参数是干啥的,filterInvocationDefinitionSource是个什么类型?
            看了一下它的源代码,其类型为:FilterInvocationDefinitionSource,那么这个类型怎么又会接收上面那么长的字符串?

            再看FilterInvocationDefinitionSource的源代码,它是个接口,这下更惨了,FilterChainProxy初始化调用set时怎么又会初始化一个接口?内部匿名类?

            先往下看.........
        ?
2,httpSessionContextIntegrationFilter -->org.acegisecurity.context.HttpSessionContextIntegrationFilter. 这个类没有属性可配.
3,logoutFilter -->org.acegisecurity.ui.logout.LogoutFilter
    通过<constuctor-arg>配置了value="/index.htm".
    又通过<constructor-arg>配置了 一个List其值为:
    
    <ref bean = "remeberMeServices">?????????????????????????????????
    
    和<bean class = "org.acegisecurity.ui.logout.SecurityContextLogoutHandler" />
4,authenicationProcessingFilter --> org.acegisecurity.ui.webapp.AuthenticationProcessingFilter
    六个property:
        authenticationManager ref authenticationManager ??????????????????????????
        authenticationFailureUrl value="/jsp/accessDenied.jsp"
        alwaysUseDefaultTargetUrl value = "true"
        defaultTargetUrl value="/pages/content.html"/
        filterProcessesUrl value="/jsp/j_acegi_security_check" ???????这个好像很关键的.
        rememberMeServices  ref="rememberMeServices" ???????????????????
5,securityContextHolderAwareRequestFilter --> org.acegisecurity.wrapper.SecurityContextHolderAwareRequestFilter 没任何属性可配.

6,rememberMeProcessingFilter --> org.acegisecurity.ui.rememberme.RememberMeProcessingFilter
    两个属性:
    authenticationManager ref="authenticationManager" ???????????????????
    rememberMeServices ref="rememberMeServices" ??????????????????

7,anonymousProcessingFilter --> org.acegisecurity.providers.anonymous.AnonymousProcessingFilter
    两个属性:
    key value="changeThis"
    userAttribute  value="anonymousUser,ROLE_ANONYMOUS"

8,exceptionTranslationFilter --> org.acegisecurity.ui.ExceptionTranslationFilter
    两个属性:
    <property name="authenticationEntryPoint">
            <bean class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilterEntryPoint">
                <property name="loginFormUrl" value="/jsp/login.jsp"/>
                <property name="forceHttps" value="false"/>
            </bean>
        </property>
        <property name="accessDeniedHandler">
            <bean class="org.acegisecurity.ui.AccessDeniedHandlerImpl">
                <property name="errorPage" value="/jsp/accessDenied.jsp"/>
            </bean>
        </property>

9,filterInvocationInterceptor --> org.acegisecurity.intercept.web.FilterSecurityInterceptor
    三个属性:
    authenticationManager ref="authenticationManager" ???????????????????????
    <property name="accessDecisionManager">
            <bean class="org.acegisecurity.vote.AffirmativeBased">
                <property name="allowIfAllAbstainDecisions" value="false"/>
                <property name="decisionVoters">
                    <list>
                        <bean class="org.acegisecurity.vote.RoleVoter"/>
                        <bean class="org.acegisecurity.vote.AuthenticatedVoter"/>
                    </list>
                </property>
            </bean>
        </property>
        <property name="objectDefinitionSource">
            <value>
                CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
                PATTERN_TYPE_APACHE_ANT
                /jsp/login.jsp=ROLE_ANONYMOUS
                /jsp/**=ROLE_MPIXTOOLGROUP
            </value>
        </property>

10, rememberMeServices --> org.acegisecurity.ui.rememberme.TokenBasedRememberMeServices
    两个属性:
    <property name="userDetailsService" ref="userDetailsService"/> ????????????
        <property name="key" value="changeThis"/>
11, authenticationManager --> org.acegisecurity.providers.ProviderManager
    一个属性:
    <property name="providers"> ????????难道说这可就是登录信息的验证来源?providers嘛.
            <list>
                <!-- To Disable LDAP, comment out ldapAuthProvider reference below -->
                <ref local="ldapAuthProvider"/>
                <ref local="daoAuthenticationProvider"/>
                <bean class="org.acegisecurity.providers.anonymous.AnonymousAuthenticationProvider">
                    <property name="key" value="changeThis"/>
                </bean>
                <bean class="org.acegisecurity.providers.rememberme.RememberMeAuthenticationProvider">
                    <property name="key" value="changeThis"/>
                </bean>
            </list>
        </property>
12, daoAuthenticationProvider --> org.acegisecurity.providers.dao.DaoAuthenticationProvider
    一个属性:
    <property name="userDetailsService" ref="userDetailsService"/>
13, userDetailsService --> org.acegisecurity.userdetails.memory.InMemoryDaoImpl
    一个属性:
    <property name="userMap">
            <value>
                jklaassen=4moreyears,ROLE_ADMIN
                test=test,ROLE_MPIXTOOLGROUP   ?????????????这是静态的验证,没有去数据库里查用户和密码吗?
                devteam=get2work,ROLE_MPIXTOOLGROUP
                jgaerlan=1234,ROLE_MPIXTOOLGROUP
                opts=opts,ROLE_OPERATIONS
            </value>
        </property>

    注意下面有一段配置被注释掉了: ??????????????这个是要到数据库里查找吧?
    <!--
            <bean id="userDetailsService" class="org.acegisecurity.userdetails.jdbc.JdbcDaoImpl">
            <property name="dataSource">
                <ref bean="dataSource"/>
            </property>
            <property name="usersByUsernameQuery">
                <value>{call dbo.MLab_User_GetInfoByUserName(?)}</value>
            </property>
            <property name="authoritiesByUsernameQuery">
                <value>{call dbo.MLab_UserRole_GetInfoByID(?)}</value>
            </property>
            </bean>
    -->
14, initialDirContextFactory --> org.acegisecurity.ldap.DefaultInitialDirContextFactory
    其配置如下:
    <constructor-arg value="ldap://dc03:389/OU=Employees,OU=Pleasanton,dc=kittyhawk,dc=funmail,dc=com"/>
        <property name="managerDn">
            <value>cn=mpixtool,OU=Employees,OU=Pleasanton,dc=kittyhawk,dc=funmail,dc=com</value>
        </property>
        <property name="managerPassword">
            <value>p@55w0rd</value> ??????????????????这个密码并没有用到呀,而是用test的
        </property>


15, userSearch --> org.acegisecurity.ldap.search.FilterBasedLdapUserSearch ?????????这个来负责登录用户的验证?
    <constructor-arg index="0">
            <value></value>
        </constructor-arg>
        <constructor-arg index="1">
            <value>sAMAccountName={0}</value>
        </constructor-arg>
        <constructor-arg index="2">
            <ref local="initialDirContextFactory"/>
        </constructor-arg>
        <property name="searchSubtree">
            <value>true</value>
        </property>
16,     ldapAuthProvider --> org.acegisecurity.providers.ldap.LdapAuthenticationProvider
    <constructor-arg>
            <bean class="org.acegisecurity.providers.ldap.authenticator.BindAuthenticator">
                <constructor-arg>
                    <ref local="initialDirContextFactory"/>
                </constructor-arg>
                <property name="userSearch">
                    <ref local="userSearch"/>
                </property>
            </bean>
        </constructor-arg>
        <constructor-arg>
            <bean class="org.acegisecurity.providers.ldap.populator.DefaultLdapAuthoritiesPopulator">
                <constructor-arg>
                    <ref local="initialDirContextFactory"/>
                </constructor-arg>
                <constructor-arg>
                    <value></value>
                </constructor-arg>
                <property name="groupRoleAttribute">
                    <value>cn</value>
                </property>
                <property name="rolePrefix">
                    <value>ROLE_</value>
                </property>
                <property name="convertToUpperCase">
                    <value>true</value>
                </property>
                <property name="defaultRole">
                    <value>IS_AUTHENTICATED_FULLY</value>
                </property>
            </bean>
        </constructor-arg>

一共配置了16个Bean,
    filterChainProxy引用的Bean有:
        --httpSessionContextIntegrationFilter,上面标号的第2个Bean.
        --logoutFilter,上面标号的第3个Bean.
            ----这个logoutFilter引用的有:
                ------ rememberMeServices(标号为10)
                    --------这个rememberMeServices引用的有:
                        ----------userDetailsService(标号为13)
        --authenicationProcessingFilter, 上面标号的第4个Bean.
            ----这个authenicationProcessingFilter引用的有:
                ------authenticationManager(标号为11)
                    --------这个authenticationManager引用的有:
                        ----------ldapAuthProvider(标号为16)
                            ------------这个IdapAuthProvider引用的有:
                                --------------initialDirContextFactory(标号为14)
                                --------------userSearch(标号为15)
                        ----------daoAuthenticationProvider(标号为12)
                            ------------这个authenticationManager引用的有:
                                --------------userDetailsService(标号为13)
                ------ rememberMeServices(标号为10)
        --securityContextHolderAwareRequestFilter, 上面标号的第5个Bean.
        --rememberMeProcessingFilter,上面标号的第6个Bean.
            ----这个rememberMeProcessingFilter引用的有:
                ------authenticationManager(标号为11)
                ------ rememberMeServices(标号为10)
        --anonymousProcessingFilter,上面标号的第7个Bean.
        --exceptionTranslationFilter,上面标号的第8个Bean.
        --filterInvocationInterceptor,上面标号的第9个Bean.
            ----这个filterInvocationInterceptor引用的有:
                ------authenticationManager(标号为11)

        止此整个Bean树解析完毕,16个Bean中除了filterChainProxy自己外的15个里它引用了8个,另外的7个又都间接地引用,filterChainProxy是带头大哥无疑了!
13
9
分享到:
评论
2 楼 SINCE1978 2009-05-31  
"这么一长串是参数是干啥的,filterInvocationDefinitionSource是个什么类型?
看了一下它的源代码,其类型为:FilterInvocationDefinitionSource,那么这个类型怎么又会接收上面那么长的字符串?........."

FilterInvocationDefinitionSource(简称FIDS吧,acegi里到处是一长串的类名,连BenAlex自己都用简称:)是FilterChainProxy的属性,它的注入是依据的spring的属性编辑器,也就是同包下的:FilterInvocationDefinitionSourceEdit类来注入的。关于此点也并非spring发明,这是javaBeans规范:spring替我们做的应该是探测同一包下的某个class是否有classEditor存在,如果有,则spring自动向JDK的PropertyEditorManager注册这个PropertyEditor.以实现由此PropertyEditor来接收xml配置文本的属性然后解析处理为对应的属性类型实例并注入。
1 楼 SSailYang 2008-03-24  
ldap 是轻量级目录访问协议,是对目录服务器中各种操作的定义,和数据库没关系。推荐楼主先看看 IBM developerWorks 上的关于 Acegi 的文章。Spring in Action 也有关于 Acegi 的文章,但是相应的 Acegi 的版本比较老,但是基本的东西都没变。

相关推荐

    acegi-security-tiger-1.0.0-RC2.jar.zip

    如果项目是基于Spring的,需要在配置文件中启用Acegi Security,并根据应用需求配置相应的安全策略。同时,需要阅读并遵守`license.txt`中的条款,以确保合法合规地使用该框架。 值得注意的是,Acegi Security后来...

    acegi-security-sample-contacts-ldap.war

    acegi-security-sample-contacts-ldap.war acegi-security-sample-contacts

    acegi-security-tiger-1.0.7.jar

    7. **可扩展性**:Acegi Security设计为模块化,开发者可以根据需要选择和配置组件,也可以轻松地添加自定义的安全策略和逻辑。 "acegi-security--license.txt"文件则包含了该软件的许可协议,通常这会是Apache ...

    acegisecurity-1.0.7

    配置文件中包含了各种安全相关元素,如、&lt;authentication-manager&gt;、&lt;intercept-url&gt;等,它们分别对应不同的安全策略和行为。 总结,Acegi Security 1.0.7作为Spring框架的重要补充,为企业级应用的安全保驾护航。...

    python_ldap-3.4.4-cp39-cp39-win32.whl.zip

    这个“python_ldap-3.4.4-cp39-cp39-win32.whl.zip”文件是Python LDAP库的特定版本,适用于Python 3.9解释器,并且是为32位Windows系统编译的。在Python生态系统中,`whl`(Wheel)文件是一种预编译的Python软件包...

    acegi-security-1.0.7.jar.zip

    这个"acegi-security-1.0.7.jar.zip"文件包含的是Acegi Security 1.0.7版本的库,它是一个压缩的Java Archive(JAR)文件,专门设计用于增强Spring框架的安全功能。 Acegi Security的核心功能包括身份验证、授权和...

    acegi-security-1.0.4.jar.zip

    - **配置**:需要在Spring配置文件中添加Acegi Security的相关配置,定义认证和授权规则。 - **依赖管理**:除了Acegi Security本身,项目可能还需要其他的依赖,例如Spring框架、AOP Alliance等,需要正确管理和...

    acegi-security-jetty-0.8.3.jar.zip

    "acegi-security-jetty-0.8.3.jar.zip"文件是Acegi Security与Jetty服务器特定版本(0.8.3)的集成包,它包含了Acegi Security的jar文件以及相关的许可证信息。 Acegi Security的主要功能包括: 1. **身份验证**:...

    acegi-security-0.8.3.jar.zip

    5. 集成其他安全机制:如与LDAP服务器集成进行目录服务认证,或者与CAS(Central Authentication Service)等单点登录系统集成。 尽管Acegi Security已被Spring Security替代,但它的设计理念和实现方式对理解现代...

    acegi-security-1.0.4.jar的源码

    6. **源码结构**:`project.xml`可能是项目构建文件,可能包含了Maven或Ant的配置,用于编译和打包源码。`src-readme.txt`可能是源码目录的说明,`notice.txt`和`license.txt`分别包含了软件的许可信息和版权声明。 ...

    acegi-security-0.8.1.jar.zip

    `acegi-security-0.8.1.jar`是该框架的库文件,包含了所有必要的类和资源,用于在项目中引入Acegi Security的功能。开发者通常会将这个JAR文件添加到项目的类路径中,以便使用其提供的服务。 `springframework-...

    python_ldap-3.4.4-cp38-cp38-win_amd64.whl.zip

    这个`python_ldap-3.4.4-cp38-cp38-win_amd64.whl`文件是一个预编译的Python轮子(Wheel)包,特别为Python 3.8(cp38)和64位Windows(win_amd64)平台设计。"whl"是一种二进制分发格式,它简化了Python库的安装...

    acegi-security-0.8.2.jar.zip

    6. **Spring集成**: Acegi Security与Spring的集成是其一大亮点,它可以利用Spring的AOP(面向切面编程)来实现安全控制。通过配置XML或注解,开发者可以轻松地定义安全拦截规则,实现无侵入的安全控制。 7. **许可...

    acegi-sample.rar_acegi-1.0.7_acegi-sample.part2_spring-1.2.4.jar

    而"acegi-sample"目录下的文件则可能包括了示例代码、配置文件等,帮助开发者快速上手和理解Acegi Security的工作原理。 总的来说,Acegi Security为基于Spring的应用提供了强大的安全基础,虽然现在已被Spring ...

    Go-ldap-test-tool一个轻量级的ldap测试工具

    在实际使用中,`shanghai-edu-ldap-test-tool-5896101` 这个文件可能是该工具的一个特定版本或发布包。下载并解压后,通常会包含源代码、可执行文件、文档和示例等内容。开发者可以通过阅读文档了解如何安装、配置和...

    python_ldap-3.4.4-cp312-cp312-win_amd64.whl.zip

    这个`python_ldap-3.4.4-cp312-cp312-win_amd64.whl`文件是专门为Python 3.12版本编译的Windows 64位平台的Python LDAP库的轮子文件(wheel file)。轮子文件是预编译的Python软件包,旨在简化安装过程,避免了通常...

    acegi-security-1.0.5.zip

    8. license.txt、readme.txt和notice.txt:这些文件分别包含了框架的许可协议、使用说明和版权信息,对于理解Acegi Security的使用权限和限制至关重要。 Acegi Security的设计理念是将安全性融入到应用程序的开发...

Global site tag (gtag.js) - Google Analytics