gpt4 book ai didi

java - 如何通过 Spring Ldap 授权获取操作属性

转载 作者:太空宇宙 更新时间:2023-11-04 10:29:27 27 4
gpt4 key购买 nike

我在 Spring 从 LDAP 身份验证附带的用户数据中读取一些操作属性时遇到困难。我知道已经有很多关于这个主题的问答,但没有一个真正对我有帮助。我需要的是获取 isMemberOf 属性。我们公司的 LDAP 管理员说“isMemberOf 是一个操作属性,因此它不包含 LDAP 身份验证响应中的常规属性。”因此,您需要按名称请求它们',他给了我他使用的这个 shell 命令,让我知道如何获取它们:

-bash-3.2$ ldapsearch -h XXX -p 10389 -b dc=entp,dc=tgc -e -1 -T -D "uid=XXX,ou=SpecialUsers,dc=entp,dc=tgc" -w XXX uid=XXX ismemberof         
dn: uid=XXX,ou=people,o=XXX,dc=entp,dc=tgc
ismemberof: cn=3G01,ou=functionGroups,ou=Groups,dc=entp,dc=tgc

我的项目中的 Spring 版本:

<spring.version>3.1.1.RELEASE</spring.version>
<spring.security.version>3.1.0.RELEASE</spring.security.version>
<spring.data.commons.version>1.3.1.RELEASE</spring.data.commons.version>
<spring.ldap.version>1.3.1.RELEASE</spring.ldap.version>

.properties 存储 ldap 配置的文件:

app.ldap.url=ldap://XXX
app.ldap.manager.base=uid=XXX,ou=SpecialUsers,dc=entp,dc=tgc
app.ldap.manager.password=XXX
app.ldap.user.base=dc=entp,dc=tgc
app.ldap.user.filter=(uid={0})
app.ldap.user.role.key=ApplicationProfile

用于身份验证的 Bean 定义:

<beans>
<s:authentication-manager alias="authenticationManager">
<s:authentication-provider ref="ldapAuthProvider" />
</s:authentication-manager>
<bean id="contextSource"
class="org.springframework.security.ldap.DefaultSpringSecurityContextSource">
<constructor-arg value="${ldap.url}" />
<property name="userDn" value="${ldap.manager.base}" />
<property name="password" value="${ldap.manager.password}" />
</bean>
<bean id="ldapAuthProvider"
class="org.springframework.security.ldap.authentication.LdapAuthenticationProvider">
<constructor-arg ref="bindAuthenticator" />
<constructor-arg ref="authoritiesPopulator" />
<property name="userDetailsContextMapper" ref="userDetailsContextMapper" />
</bean>
<bean id="bindAuthenticator"
class="org.springframework.security.ldap.authentication.BindAuthenticator">
<constructor-arg ref="contextSource" />
<property name="userSearch" ref="userSearch"/>
</bean>
<bean id="userSearch"
class="org.springframework.security.ldap.search.FilterBasedLdapUserSearch">
<constructor-arg value="${ldap.user.base}" />
<constructor-arg value="${ldap.user.filter}" />
<constructor-arg ref="contextSource" />
</bean>

<bean id="authoritiesPopulator"
class="core.spring.security.ldap.AttributeBasedLDAPAuthoritiesPopulator">
<constructor-arg value="${ldap.user.role.key}" />
</bean>

<bean id="userDetailsContextMapper"
class="core.spring.security.ldap.CustomUserDetailsContextMapper" />
</beans>

当我调试在 AttributeBasedLDAPAuthoritiesPopulator 类中填充权限的 getGrantedAuthorities(DirContextOperations userData, String username) 函数时,userData 仅包含这些属性,而不包含其他类似 isMemberOf 的属性(XXX 实际上是一些真实数据):

birthdate=birthdate: 06/28/1983, 
givenname=givenName: Dummy User,
mobile=mobile: XXX,
workflowaccess=WorkflowAccess: 0,
objectclass=objectClass: mdsMVLink, top, person, inetOrgPerson, organizationalPerson, inetUser, inetAdmin, iplanet-am-managed-person, iPlanetPreferences, iplanet-am-user-service,
mdsmvlinktype=mdsMVLinkType: MV#CV1#A,
userpassword=userPassword: XXX,
mdsentityowner=mdsEntityOwner: MV,META,
ou=ou: XXX,
applicationprofile=ApplicationProfile: XXX
uid=uid: XXX,
mail=mail: XXX,
cn=cn: XXX,
managername=managerName: XXX,
manager=manager: uid=XXX,ou=people,o=XXX,dc=entp,dc=tgc,
employeenumber=employeeNumber: TEST15,
functionalgroupname=functionalgroupname: dummy-functionalgroupname,
mdslinktocv=mdsLinkToCV: MV#CV1#uid=DUMMY,ou=Employees,
status=status: 1,
mdsmvmembership=mdsMVMembership: CV1#True,
inetuserstatus=inetUserStatus: Active,
description=description: XXX,
sn=sn: for TEA project,
organization=Organization: XXX

所以我的问题是如何通过这些属性获得 isMemberOf 属性?

<小时/>

到目前为止我尝试过的:

1- 在 .properties 中添加另一个过滤器以包含 ismemberof

app.ldap.user.filter=(&(uid={0})(ismemberof=*))

2- 使 isMemberOf 成为角色的关键字

app.ldap.user.role.key=isMemberOf

3-尝试从填充器类中的 userData 显式获取它

userData.getObjectAttributes("isMemberOf")

最佳答案

您需要将属性 ismemberof 添加到 userSearch bean 的请求属性中:

<bean id="userSearch"
class="org.springframework.security.ldap.search.FilterBasedLdapUserSearch">
<constructor-arg value="${ldap.user.base}" />
<constructor-arg value="${ldap.user.filter}" />
<constructor-arg ref="contextSource" />
<property name="returningAttributes">
<list>
<value>*</value>
<value>ismemberof</value>
</list>
</property>
</bean>

由于 ldap 服务器的行为,您需要指定两个值(*ismemberof):

  • 如果不指定属性名称,则会返回所有用户属性
  • 如果您指定属性名称,它将准确返回这些属性(无论是用户属性还是操作属性)
  • 如果您想要所有用户属性和一些操作属性,请为所有用户属性指定 * 并列出您想要的所有操作属性

关于java - 如何通过 Spring Ldap 授权获取操作属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50187911/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com