同时支持基本身份验证+ LDAP和预身份验证

时间:2014-05-05 07:39:04

标签: java authentication spring-security

我有一个安全应用程序上下文,可以正常使用预身份验证。

我想知道是否可以同时使用基本身份验证(使用LDAP绑定作为身份验证管理器)和预身份验证:

如果容器提供主体名称,我们将依赖它(并转到LDAP获取用户详细信息),如果没有发生容器的预认证(例如我们已经部署在Jetty中进行测试而没有预先验证),我们希望使用基本身份验证,然后由LDAP绑定进行身份验证。

有可能吗?我该怎么办?

这是我现有的(简化的)应用上下文:

<s:global-method-security
    secured-annotations="enabled"
    pre-post-annotations="enabled"
    proxy-target-class="true" />

<bean id="springSecurityFilterChain" class="org.springframework.security.web.FilterChainProxy">
    <s:filter-chain-map path-type="ant">
        <s:filter-chain pattern="/**"
            filters="securityContextPersistenceFilter,preAuthenticatedFilter" />
    </s:filter-chain-map>
</bean>

<bean id="securityContextPersistenceFilter"
    class="org.springframework.security.web.context.SecurityContextPersistenceFilter">
    <property name='securityContextRepository'>
        <bean
            class='org.springframework.security.web.context.HttpSessionSecurityContextRepository'>
            <property name='allowSessionCreation' value='true' />
        </bean>
    </property>
</bean>


<bean id="preAuthenticatedFilter"
    class="org.springframework.security.web.authentication.preauth.j2ee.J2eePreAuthenticatedProcessingFilter">

    <property name="authenticationManager" ref="authenticationManager" />
</bean>

<s:authentication-manager alias="authenticationManager">
    <s:authentication-provider ref="preAuthenticatedAuthProvider"   />
</s:authentication-manager>

<bean id="preAuthenticatedAuthProvider" class="org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationProvider">
    <property name="preAuthenticatedUserDetailsService" >
        <bean class="org.springframework.security.core.userdetails.UserDetailsByNameServiceWrapper" >
            <property name="userDetailsService" ref="userDetailsService" />
        </bean>
    </property>
</bean>

<bean id="contextSource"
    class="org.springframework.security.ldap.DefaultSpringSecurityContextSource">
    <!-- some config skipped -->
</bean>

<bean id="userDetailsService" class="org.springframework.security.ldap.userdetails.LdapUserDetailsService" >
    <constructor-arg index="0" ref="ldapUserSearch"/>
    <constructor-arg index="1" ref="ldapAuthoritiesPopulator"/>
    <property name="userDetailsMapper"  ref="fooUserDetailsMapper" />
</bean>
<bean id="fooUserDetailsMapper" class="com.foo.FooUserDetailsMapper" />

<bean id="ldapUserSearch" class="org.springframework.security.ldap.search.FilterBasedLdapUserSearch">
    <!-- some config skipped -->
</bean>

<bean id="ldapAuthoritiesPopulator"
    class="org.springframework.security.ldap.userdetails.DefaultLdapAuthoritiesPopulator">
    <!-- some config skipped -->
</bean>

<bean id="ldapTemplate" class="org.springframework.ldap.core.simple.SimpleLdapTemplate">
    <constructor-arg ref="contextSource" />
</bean>



<bean id="ldapAuthorities" class="com.fil.ims.LdapAuthoritiesServices" />

我尝试过以下但没有一个可以使用

  1. 添加新的ldap身份验证提供程序(org.springframework.security.ldap.authentication.LdapAuthenticationProvider),并在<s:authentication-provider>下添加一个<s:authentication-manager>条目,或
  2. 添加一个单独的org.springframework.security.web.authentication.www.BasicAuthenticationFilter,指向新的<s:authentication-provider>,指向新的ldap身份验证提供程序(它正在抱怨"An AuthenticationEntryPoint is required"。)
  3. 这样做的正确方法是什么?

    从我的理解,似乎2应该是正确的方式,如果有人可以给我一些方向,那就足够了。

    由于

0 个答案:

没有答案