0

我的 app-security.xml 上有这个,如果用户登录 LDAP,我想做一些任务,如果用户登录 DB,我想做其他任务,等等。

    <ldap-server url="ldap://192.168.0.55:389/dc=fluxit,dc=com,dc=ar"
                   manager-dn="uid=admin,ou=system" 
                   manager-password="infra123" 
  />


    <authentication-manager>

        <authentication-provider user-service-ref='databaseAuthManager'>
            <password-encoder ref="encoder" />
        </authentication-provider>

        <authentication-provider>
            <password-encoder ref="encoder" />
            <user-service id="textFileAuthManager" properties="classpath:auth/users.properties" />
        </authentication-provider>

        <ldap-authentication-provider
            user-search-filter="(uid={0})" user-search-base="ou=users"
            group-search-filter="(uniqueMember={0})" group-search-base="ou=groups"
            group-role-attribute="cn" role-prefix="ROLE_">
        </ldap-authentication-provider>


    </authentication-manager>

我可以在春天这样做吗?我已经在谷歌上搜索了一段时间,但没有找到答案。

太感谢了!

4

1 回答 1

1

我认为您的要求的困难在于身份验证管理器不保留特定身份验证提供者是实际验证请求的信息。如果您有那条信息,您可以轻松地编写一个自定义AuthenticationSuccessHandler来实现某些行为,该行为取决于成功的身份验证方法。

如果你真的需要这个功能,我可以提出一个可能的解决方案:实现一个 custom ProviderManager,它将使用一个装饰器包装身份验证对象,该装饰器保存对成功身份验证提供程序的引用。由于 的实现ProviderManager不提供可用于此的扩展点,因此您基本上需要复制整个类以进行所需的增强。然后您将不得不在<authentication-manager>不使用安全命名空间的情况下重写配置的整个部分,因为它不允许您替换默认AuthenticationManager实现。

这既不是太优雅也不是很简单的解决方案,所以可能有一些更好的方法来做到这一点。

于 2013-03-14T14:11:50.927 回答