【问题标题】:How to get Operational Attrs with Spring Ldap Authorization如何通过 Spring Ldap 授权获取 Operational Attrs
【发布时间】:2018-10-15 16:59:14
【问题描述】:

我很难从春季使用 ldap 身份验证的用户数据中读取一些操作属性。我知道已经有很多关于这个主题的问答,但没有一个真的对我有帮助。我需要的是获得isMemberOf attrs。我们公司的 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 attrs?


到目前为止我尝试过的:

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

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

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

app.ldap.user.role.key=isMemberOf

3- 试图从 populator 类中的 userData 显式获取它

userData.getObjectAttributes("isMemberOf")

【问题讨论】:

    标签: java spring spring-ldap


    【解决方案1】:

    您需要将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):

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

    【讨论】:

    • 感谢您的回答,但没有运气。即使我删除 &lt;value&gt;*&lt;/value&gt; 并仅使用 &lt;value&gt;ismemberof&lt;/value&gt;,它仍然只返回基本属性
    猜你喜欢
    • 1970-01-01
    • 2020-02-04
    • 2015-09-03
    • 2011-09-08
    • 2018-06-13
    • 2020-12-03
    • 1970-01-01
    • 1970-01-01
    • 2019-03-21
    相关资源
    最近更新 更多