Java 在Spring Security中通过LDAP对Active Directory进行身份验证时,如何实现自定义UserDetails对象?

Java 在Spring Security中通过LDAP对Active Directory进行身份验证时,如何实现自定义UserDetails对象?,java,active-directory,spring-security,ldap,spring-security-ldap,Java,Active Directory,Spring Security,Ldap,Spring Security Ldap,在我的工作中,我继续涉猎将Spring Security集成到现有应用程序的黑暗水域,该应用程序最终必须通过LDAP(通过TLS)对Active Directory进行身份验证,并根据组成员资格或用户对象上自定义AD字段中存储的字符串填充用户权限 我当前的问题是,虽然我已经成功地管理了上述所有内容,但我还没有成功地将具有自定义权限的用户对象存储到会话中。这意味着,无需额外工作,每个用户都将享受最近登录的用户可用的权限 我通过将用户权限存储在哈希表对象中解决了这个问题,我可以通过使用@PreAut

在我的工作中,我继续涉猎将Spring Security集成到现有应用程序的黑暗水域,该应用程序最终必须通过LDAP(通过TLS)对Active Directory进行身份验证,并根据组成员资格或用户对象上自定义AD字段中存储的字符串填充用户权限

我当前的问题是,虽然我已经成功地管理了上述所有内容,但我还没有成功地将具有自定义权限的用户对象存储到会话中。这意味着,无需额外工作,每个用户都将享受最近登录的用户可用的权限

我通过将用户权限存储在
哈希表
对象中解决了这个问题,我可以通过使用
@PreAuthorize(“isAuthenticated()and principal.name==#username”)
注释其getter/setter来保护该对象,但这显然并不理想。我更愿意将从AD收集的自定义信息作为自定义用户对象的一部分存储到会话中。但是怎么做呢

我的
security.xml
ldap.xml
配置的相关部分分别如下所示:

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


我预见到的一个问题是,当调用
loadUserAuthories()
方法(为我自定义使用AD fiels而重写)时,
SecurityContextHolder.getContext().getAuthentication()
返回
null
。这是一个问题——它表明(据我所知,Spring对会话的处理)身份验证过程尚未完成,并且尚未生成与待验证用户相关的会话ID。也就是说,Spring会在身份验证时清除匿名会话,以支持新的会话ID,但当运行
LoadUserAuthories()
时,该会话显然不可用

那我该怎么办?正如我所说的,我的黑客程序是有效的,而且似乎是安全的(提供了正确的注释),但它并不理想。如何正确地将自定义用户信息存储到会话范围的用户对象上,同时通过LDAP(通过TLS)维护针对AD的身份验证


一如既往,我喜欢并感谢SO社区为我提供的所有帮助。

既然您使用自己的AuthenticationProvider,您需要自己创建AuthenticationToken。因为我自己还没有实现LDAP身份验证,所以我帮不了多少忙。但是我想如果你发布你的authenticationProvider,对其他人会有帮助。(顺便说一句,我想spring security附带了一个内置的LdapAuthenticationProvider?你可以试一下作为参考。)你有没有得到过这个答案?
<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>