Как получить операционные атрибуты с помощью Spring Ldap Authorization - PullRequest
0 голосов
/ 05 мая 2018

У меня возникают трудности при чтении некоторых операционных атрибутов из пользовательских данных, поступающих с аутентификацией ldap весной. Я знаю, что уже есть много вопросов и ответов по этому вопросу, но никто из них не помог мне. Что мне нужно, так это получить isMemberOf attrs. Администратор нашей компании LDAP говорит: « isMemberOf - это рабочий атрибут, поэтому он не идет с обычными из ответа аутентификации ldap. Поэтому вам нужно запросить их по имени ', и он дал мне команду оболочки, которую он использует для этого, чтобы дать мне идею получить их:

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

Определение бинов для аутентификации:

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

И когда я отлаживаю функцию getGrantedAuthorities(DirContextOperations userData, String username), которая заполняет полномочия в моем классе AttributeBasedLDAPAuthoritiesPopulator, 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 - Попытка получить его явно из userData в классе populator

userData.getObjectAttributes("isMemberOf")

1 Ответ

0 голосов
/ 10 мая 2018

Вам необходимо добавить атрибут 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>

Вам необходимо указать оба значения (* и ismemberof) из-за поведения сервера ldap:

  • если вы не укажете имена атрибутов, будут возвращены все пользовательские атрибуты
  • если вы укажете имена атрибутов, он вернет именно эти атрибуты (пользовательские или операционные)
  • если вам нужны все пользовательские атрибуты и некоторые рабочие атрибуты, вы указываете * для всех пользовательских атрибутов и перечисляете все необходимые операционные атрибуты
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...