与我之前的 问题一样,我继续涉足将 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 社区获得的所有帮助。