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

2019-09-02 09:48发布

我有春季安全配置为对LDAP服务器进行身份验证。

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

</security:authentication-manager>

认证后,我想加载从本地数据库角色的相同用户。 我如何使用“LDAP身份验证提供者”加载本地数据库角色?

如果我添加下面的第二身份验证提供:

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

daoAuthenticationProvider加入,但是当第一身份验证提供者对用户进行认证Spring不使用第二供应商。 只有当第一身份验证提供身份验证失败它将出现在列表中的下。

所以基本上像我们定制

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

加载从本地数据库角色。

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

Answer 1:

身份验证提供者必须提供在全成认证完全填充的认证令牌,所以它不可能使用一个供应商来检查用户的凭据,而另一个分配机构(角色)给它。

但是,您可以自定义一个LDAP身份验证提供者的数据库,而不是默认的行为(在LDAP搜索的用户团体)获取用户角色。 该LdapAuthenticationProvider注入了两种策略:一种是执行认证( LdapAuthenticator ),以及另外一个,获取用户的权限( LdapAuthoritiesPopulator )。 如果你提供一个你可以达到你的要求LdapAuthoritiesPopulator从数据库加载角色的实现。 如果你已经有了一个UserDetailsService针对数据库的工作,你可以通过在包装很容易集成了UserDetailsServiceLdapAuthoritiesPopulator并在其注入LdapAuthenticationProvider

由于这种配置是相当罕见的,安全的XML命名空间不提供标签/属性来进行设置,但生豆的配置是不是太复杂。 这里是概要:

1)我想你有一个ldap-server在您的配置地方。 它分配和重要的id给它,这将让我们随后参考。

<security:ldap-server url="..." id="ldapServer" .../>

2)从authentication-manager中,您将仅指定制提供商:

<security:authentication-manager>
    <security:authentication-provider ref="customLdapAuthProvider"/>
</security:authentication-manager>

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>

authenticator是基本相同的,因为这将被命名空间配置创建的一个。 (请注意, contextSource属性引用的LDAP服务器。)

authoritiesPopulator是在你一个简单的包装userService实现它应该是在你的配置某处定义。



文章来源: Spring LdapAuthentication and Load roles from local database