Получить атрибуты пользователя LDAP из CAS

у меня сейчас проблемы с CAS в связке с LDAP. Я хочу реализовать решение SSO для нескольких приложений. Аутентификация работает отлично до сих пор. Мы хотим авторизовать пользователей на основе их ролей, настроенных в LDAP. Проблема в том, что CAS не предоставляет роли пользователей.

Я сейчас так далеко, что знаю, что deployerConfigContext.xml нужно настроить. Я также нашел различные руководства, большинство из которых работают либо с неправильной версией CAS, либо не делают того, что я хочу.

Наши пользователи находятся в cn=admin,cn=users,dc=manager,dc=local, группы - в cn=admins,ou=groups,dc=manager,dc=local. Версия CAS 3.5.2.

Я пробовал вставлять что-то вроде этого:

<bean id="attributeRepository" class="org.jasig.services.persondir.support.StubPersonAttributeDao">
    <property name="backingMap">
        <map>
            <entry key="uid" value="uid" />
            <entry key="eduPersonAffiliation" value="eduPersonAffiliation" />
            <entry key="groupMembership" value="groupMembership" />
        </map>
    </property>
    <property name="query" value="(uid={0})" />
    <property name="contextSource" ref="contextSource" />
    <property name="ldapAttributesToPortalAttributes">
        <map>
            <entry key="cn" value="Name" />
            <entry key="home" value="homeDirectory" />
        </map>
    </property>
</bean>

CAS сказал мне, что ему не нравятся свойства query, contextSource и ldapAttributesToPortalAttributes. Я хотел получить «простой» атрибут homeDirectory.

Может ли кто-нибудь из вас дать мне совет, как настроить этот злой XML-файл? Если хотите, я также могу предоставить полный файл xml.

ОБНОВЛЕНИЕ

Немного повозившись, я попытался настроить attributeRepository, как на этом сайте: https://wiki.jasig.org/display/CASUM/Attributes в главе Populate Principal's attributes with LDAP repository. В результате CAS не запускается, а выдает сообщение

Bean property 'ldapAttributesToPortalAttributes' is not writable or has an invalid setter method.

Мой attributeRepository выглядит так:

<bean id="attributeRepository"  class="org.jasig.services.persondir.support.ldap.LdapPersonAttributeDao">
    <property name="ldapAttributesToPortalAttributes">
        <map>
            <entry key="cn" value="Name" />
            <entry key="home" value="homeDirectory" />
        </map>
    </property>
</bean>

person Joshua    schedule 28.11.2013    source источник


Ответы (1)


У меня есть следующий боб

<bean id="attributeRepository"
    class="org.jasig.services.persondir.support.ldap.LdapPersonAttributeDao">
    <property name="baseDN" value="ou=groups,dc=manager,dc=local"/>     
    <property name="contextSource" ref="contextSource" />
    <property name="requireAllQueryAttributes" value="true"/>
    <property name="queryAttributeMapping">
        <map>
            <entry key="username" value="sAMAccountName" />
        </map>
    </property>     
    <property name="resultAttributeMapping">
        <map>               
            <entry key="displayName" value="cn" />
        </map>
    </property>
</bean>

Где вы сопоставляете атрибут displayName как cn. Строками ниже в файле deployerConfigContext.xml вы найдете allowedAttributes, если он не существует, вы можете добавить его. Используя это, вы загрузите эту информацию в сеанс.

<bean
    id="serviceRegistryDao"
    class="org.jasig.cas.services.InMemoryServiceRegistryDaoImpl">
        <property name="registeredServices">
            <list>
                <bean class="org.jasig.cas.services.RegexRegisteredService">
                    <property name="id" value="0" />
                    <property name="name" value="HTTP and IMAP" />
                    <property name="description" value="Allows HTTP(S) and IMAP(S) protocols" />
                    <property name="serviceId" value="^(https?|imaps?)://.*" />
                    <property name="evaluationOrder" value="10000001" />
                    <property name="allowedAttributes">
                        <list>
                            <value>cn</value>
                        </list>
                    </property> 
                </bean>                    
            </list>
        </property>
    </bean>

Чтобы вернуть эти значения из CAS, измените файл casServiceValidationSuccess.jsp (расположенный в WEB-INF/view/jsp/protocol/2.0).

<cas:attributes>
<c:forEach var="auth" items="${assertion.chainedAuthentications}">
<c:forEach var="attr" items="${auth.principal.attributes}" >
<cas:${fn:escapeXml(attr.key)}>${fn:escapeXml(attr.value)}        </cas:${fn:escapeXml(attr.key)}>
</c:forEach>
</c:forEach>
</cas:attributes>
person Eddú Meléndez    schedule 24.12.2013
comment
Я сравнил bean-компоненты со своими настройками в deployerContext.xml и добавил отсутствующее свойство allowAttributes в serviceRegistryDao. Теперь я могу открыть страницу CAS Manage Services и назначить атрибуты, которые мне нужны в моем приложении. Это работает. Есть ли способ сделать это назначение файлом конфигурации? - person DaSilva2010; 13.01.2014
comment
Если вы хотите вернуть больше значений из ldap, добавьте больше записей в это свойство resultAttributeMapping в bean-компоненте attributeRepository и поместите их псевдонимы. Эти псевдонимы должны быть сопоставлены с allowedAttributes в компоненте serviceRegistryDao. - person Eddú Meléndez; 13.01.2014
comment
Я изменил serviceRegistryDao, чтобы использовать базу данных для хранения конфигурации. См. здесь: wiki.jasig.org/display/CASUM/Configuring - person DaSilva2010; 15.01.2014