我有春季安全配置为对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}" />
加载从本地数据库角色。
有什么建议? 如何来实施?
身份验证提供者必须提供在全成认证完全填充的认证令牌,所以它不可能使用一个供应商来检查用户的凭据,而另一个分配机构(角色)给它。
但是,您可以自定义一个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
实现它应该是在你的配置某处定义。