Spring LdapAuthentication和从本地数据库加载角色

use*_*797 5 spring roles spring-security

我已将Spring Security配置为针对LDAP服务器进行身份验证.

<security:authentication-manager >
    <security:ldap-authentication-provider user-dn-pattern="uid={0}" />

</security:authentication-manager>
Run Code Online (Sandbox Code Playgroud)

身份验证后,我想从本地数据库为同一用户加载角色.如何使用"ldap-authentication-provider"加载本地数据库角色?

如果我添加第二个身份验证提供程序如下:

<security:authentication-manager >
    <security:ldap-authentication-provider user-dn-pattern="uid={0}" />
            <security:authentication-provider ref="daoAuthenticationProvider" />
</security:authentication-manager>
Run Code Online (Sandbox Code Playgroud)

daoAuthenticationProvider添加了,但是当第一个auth提供程序对用户进行身份验证时,Spring不使用第二个提供程序.只有当第一个auth提供程序无法对其进行身份验证时,才会在列表中接下来.

所以基本上看起来我们必须定制

<security:ldap-authentication-provider user-dn-pattern="uid={0}" />
Run Code Online (Sandbox Code Playgroud)

从本地数据库加载ROLE.

有什么建议?该如何实施?

zag*_*gyi 5

身份验证提供程序必须在成功身份验证时提供完全填充的身份验证令牌,因此无法使用一个提供程序检查用户的凭据,而另一个提供程序则可以为其分配权限(角色).

但是,您可以自定义ldap auth提供程序以从数据库获取用户角色而不是默认行为(在ldap中搜索用户的组).该LdapAuthenticationProvider注入了两种策略:一种是执行认证(LdapAuthenticator),和另外一个,获取用户的权限(LdapAuthoritiesPopulator).如果提供LdapAuthoritiesPopulator从数据库加载角色的实现,则可以实现您的要求.如果您已经UserDetailsService对数据库进行了操作,则可以通过将其包装在a中UserDetailsServiceLdapAuthoritiesPopulator并将其注入到数据库中来轻松地集成它LdapAuthenticationProvider.

由于此配置相当罕见,因此安全xml命名空间不提供标记/属性来设置它,但原始bean配置并不太复杂.这是大纲:

1)我想你ldap-server的配置中有一个地方.分配和分配它很重要id,这将使我们以后可以参考它.

<security:ldap-server url="..." id="ldapServer" .../>
Run Code Online (Sandbox Code Playgroud)

2)从该authentication-manager部分,您将只参考自定义提供商:

<security:authentication-manager>
    <security:authentication-provider ref="customLdapAuthProvider"/>
</security:authentication-manager>
Run Code Online (Sandbox Code Playgroud)

3)现在,必不可少的部分:

<bean id="customLdapAuthProvider" class="org.springframework.security.ldap.authentication.LdapAuthenticationProvider">
    <constructor-arg name="authenticator">
        <bean class="org.springframework.security.ldap.authentication.BindAuthenticator">
            <constructor-arg name="contextSource" ref="ldapServer"/>
            <property name="userDnPatterns">
                <list>
                    <value>uid={0}</value>
                </list>
            </property>
        </bean>
    </constructor-arg>
    <constructor-arg name="authoritiesPopulator">
        <bean class="org.springframework.security.ldap.authentication.UserDetailsServiceLdapAuthoritiesPopulator">
            <constructor-arg name="userService" ref="userService"/>
        </bean>
    </constructor-arg>
</bean>
Run Code Online (Sandbox Code Playgroud)

authenticator与命名空间配置创建的基本相同.(注意contextSource引用ldap服务器的属性.)

authoritiesPopulator是一个简单的userService实现包装器,它应该在你的配置中的某个地方定义.