如何在Spring Security和ActiveDirectoryLdapAuthenticationProvider中使用自定义权限填充程序?

时间:2013-04-19 20:37:38

标签: java spring active-directory spring-security ldap

我已成功通过LDAP连接到Active Directory进行身份验证,并在我的ldap.xml中使用以下内容调用了自定义权限populator:

    <bean id="ldapAuthenticationProvider"
        class="org.springframework.security.ldap.authentication.LdapAuthenticationProvider">
    <constructor-arg ref="ldapBindAuthenticator"/>
    <constructor-arg ref="ldapAuthoritiesPopulator"/>
</bean>

<bean id="ldapBindAuthenticator"
        class="org.springframework.security.ldap.authentication.BindAuthenticator">
    <constructor-arg ref="ldapServer"/>
    <property name="userSearch" ref="ldapSearch"/>
</bean>

<bean id="ldapSearch"
        class="org.springframework.security.ldap.search.FilterBasedLdapUserSearch">
    <constructor-arg value="CN=Users"/>
    <constructor-arg value="(sAMAccountName={0})"/>
    <constructor-arg ref="ldapServer"/>
</bean>

<bean id="ldapAuthoritiesPopulator"
        class="my.project.package.ActiveDirectoryLdapAuthoritiesPopulator"/>

<bean id="ldapServer"
        class="org.springframework.security.ldap.DefaultSpringSecurityContextSource">
    <constructor-arg value="ldap://192.168.0.2/dc=test,dc=server"/>

    <property name="userDn" value="ldap@test.server"/>
    <property name="password" value="ldap"/>
    <property name="baseEnvironmentProperties">
        <map>
            <entry key="java.naming.referral">
                <value>follow</value>
            </entry>
        </map>
    </property>
</bean>

这很好用,我可以根据她的组成员身份确定用户的授权,但我宁愿通过内置的Active Directory LDAP身份验证提供程序来执行此操作:

<bean id="ldapAuthenticationProvider"
        class="org.springframework.security.ldap.authentication.ad.ActiveDirectoryLdapAuthenticationProvider">

        <constructor-arg value="test.server"/>
        <constructor-arg value="ldap://192.168.0.2:389"/>
        <property name="convertSubErrorCodesToExceptions" value="true"/>
</bean>

上面的问题是我的自定义权限populator(显然)没有被调用,所以虽然我可以验证我的用户(使用上面的),但我没有组(我需要确定授权)

我觉得这是一个简单的问题,但对于我的生活,我无法在这里或其他任何地方找到答案。我是否必须扩展ActiveDirectoryLdapAuthenticationProvider类,并从那里调用我的权限populator?

(感谢本网站多年来给予我的所有帮助;这个网站的有效性可以通过我最近只打算创建一个帐户的事实来衡量,这是我的第一个问题。谢谢提前帮助。)

1 个答案:

答案 0 :(得分:9)

Spring的ActiveDirectoryLdapAuthenticationProvider类是final,所以我唯一真正的选择(如果有任何参与者,我会接受更好的选择)就是分叉。我复制并粘贴了其内容,稍微重构,并删除了final名称。然后,我创建了一个forked类的单独子类,覆盖了loadUserAuthorities()方法,并添加了我自己的代码来构建权限掩码。

然后我可以编辑我的ldap.xml文件,如下所示:

    <bean id="ldapAuthenticationProvider"
            class="my.project.package.OverrideActiveDirectoryLdapAuthenticationProvider">   
        <constructor-arg value="test.server"/>
        <constructor-arg value="ldap://192.168.0.2:389"/>
        <property name="convertSubErrorCodesToExceptions" value="true"/>
</bean>

对于像我这样的任何其他n00bs,子类看起来像这样:

public class OverrideActiveDirectoryLdapAuthenticationProvider extends TestActiveDirectoryLdapAuthenticationProvider {

//my assignments

public OverrideActiveDirectoryLdapAuthenticationProvider(String domain,
        String url) {
    super(domain, url);
}

@Override
protected Collection<? extends GrantedAuthority> loadUserAuthorities(DirContextOperations userData, String username, String password) {
//original code with my own additions
//in my case, I injected code into the for(group : groups) loop
}

像魅力一样工作。

非常感谢zagyi的帮助。