1

与我之前的 问题一样,我继续涉足将 Spring Security 集成到现有应用程序中的浑水,该应用程序最终必须通过 LDAP(通过 TLS)针对 Active Directory 进行身份验证,并根据组成员身份或基于字符串存储在用户对象的自定义 AD 字段中。

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

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

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

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

<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>

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

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

与往常一样,我喜欢并感谢我从 SO 社区获得的所有帮助。

4

0 回答 0