mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-07-24 17:32:48 +00:00
Merged V2.1 to HEAD
6466: Xml metadata. Support for pulling collections of values from XML 6470: Fix for AWC-1321 - Using zero as items per page gives error for Alfresco repos in OpenSearch 6471: Fix for AWC-1496 - OpenSearch dashlet can get in a state where search queries are not executed 6472: Fix for AWC-1495. Searching additional attributes now working correctly for folders. 6473: Fix for AR-1251 (Version error when saving new content via CIFS) 6474: Updated bundles and installers - added missing files back into Linux bundle 6475: LDAP and chainging authentication Resolved conflicted state of 'root\projects\repository\source\java\org\alfresco\repo\security\authentication\AuthenticationUtil.java' 6477: XForms WCM-696. 6478: Fix for WCM-567 (IndexOutOfBoundsException when stepping through wizard rapidly) 6480: Fix to issue when removing locks on directories. 6481: Updated installer and config wizard to fix download option and config behaviour when called from installer. 6482: Fix for WCM-1229 (properties sheet does not refresh) 6483: Fix for AR-1511 6484: Fix for AR-1351 6485: Missed a unit test update git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@6737 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
@@ -74,7 +74,6 @@
|
||||
<!-- The authroity DAO implements an interface extended from the Acegi -->
|
||||
<!-- DAO that supports CRUD. -->
|
||||
|
||||
<alias name="authenticationDao" alias="alfDaoImpl"/> <!-- TODO: Remove -->
|
||||
<bean id="authenticationDao" class="org.alfresco.repo.security.authentication.RepositoryAuthenticationDao">
|
||||
<property name="nodeService">
|
||||
<ref bean="nodeService" />
|
||||
@@ -118,7 +117,6 @@
|
||||
<!-- The permissions service is required so that permissions can be -->
|
||||
<!-- cleaned up when a user is deleted. -->
|
||||
|
||||
<alias name="authenticationService" alias="authenticationServiceImpl"/> <!-- TODO: Remove -->
|
||||
<bean id="authenticationService" class="org.alfresco.repo.security.authentication.AuthenticationServiceImpl">
|
||||
<property name="authenticationDao">
|
||||
<ref bean="authenticationDao" />
|
||||
|
@@ -519,7 +519,7 @@
|
||||
<ref bean="policyComponent" />
|
||||
</property>
|
||||
<property name="authenticationService">
|
||||
<ref bean="authenticationServiceImpl"></ref>
|
||||
<ref bean="authenticationService"></ref>
|
||||
</property>
|
||||
<property name="ownableService">
|
||||
<ref bean="ownableService"></ref>
|
||||
|
@@ -5,9 +5,9 @@
|
||||
|
||||
|
||||
|
||||
<!-- Chaining -->
|
||||
<!-- Chaining of both the services and components -->
|
||||
|
||||
<bean id="authenticationServiceImpl" class="org.alfresco.repo.security.authentication.ChainingAuthenticationServiceImpl">
|
||||
<bean id="authenticationService" class="org.alfresco.repo.security.authentication.ChainingAuthenticationServiceImpl">
|
||||
<property name="authenticationServices">
|
||||
<list>
|
||||
<ref bean="authenticationServiceImplJAAS"/>
|
||||
@@ -18,6 +18,17 @@
|
||||
</property>
|
||||
</bean>
|
||||
|
||||
<bean id="authenticationComponent" class="org.alfresco.repo.security.authentication.ChainingAuthenticationComponentImpl">
|
||||
<property name="authenticationComponentss">
|
||||
<list>
|
||||
<ref bean="authenticationComponentImplJAAS"/>
|
||||
</list>
|
||||
</property>
|
||||
<property name="mutableAuthenticationComponent">
|
||||
<ref bean="authenticationComponentImplAlfresco"/>
|
||||
</property>
|
||||
</bean>
|
||||
|
||||
<!-- Alfresco Auth -->
|
||||
|
||||
<bean id="authenticationServiceImplAlfresco" class="org.alfresco.repo.security.authentication.AuthenticationServiceImpl">
|
||||
|
@@ -3,6 +3,17 @@
|
||||
|
||||
<beans>
|
||||
|
||||
<!-- The main configuration has moved into a properties file -->
|
||||
|
||||
<bean name="ldapAuthenticationPlaceholderConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
|
||||
<property name="ignoreUnresolvablePlaceholders">
|
||||
<value>true</value>
|
||||
</property>
|
||||
<property name="locations">
|
||||
<value>classpath:alfresco/extension/ldap-authentication.properties</value>
|
||||
</property>
|
||||
</bean>
|
||||
|
||||
<!-- DAO that rejects changes - LDAP is read only at the moment. It does allow users to be deleted with out warnings from the UI. -->
|
||||
|
||||
<bean name="authenticationDao" class="org.alfresco.repo.security.authentication.DefaultMutableAuthenticationDao" >
|
||||
@@ -34,11 +45,11 @@
|
||||
"%s" - the user id is passed through without modification.
|
||||
Used for LDAP authentication such as DIGEST-MD5, anything that is not "simple".
|
||||
|
||||
"cn=%s,ou=London,dc=company,dc=com" - If the user types in "Joe Bloggs" the authentricate as "cn=Joe Bloggs,ou=London,dc=company,dc=com"
|
||||
Usually for simple authentication.
|
||||
"cn=%s,ou=London,dc=company,dc=com" - If the user types in "Joe Bloggs" the authenticate as "cn=Joe Bloggs,ou=London,dc=company,dc=com"
|
||||
Usually for simple authentication. Simple authentication always uses the DN for the user.
|
||||
|
||||
-->
|
||||
<value>%s</value>
|
||||
<value>${ldap.authentication.userNameFormat}</value>
|
||||
</property>
|
||||
</bean>
|
||||
|
||||
@@ -54,14 +65,14 @@
|
||||
<map>
|
||||
<!-- The LDAP provider -->
|
||||
<entry key="java.naming.factory.initial">
|
||||
<value>com.sun.jndi.ldap.LdapCtxFactory</value>
|
||||
<value>${ldap.authentication.java.naming.factory.initial}</value>
|
||||
</entry>
|
||||
|
||||
<!-- The url to the LDAP server -->
|
||||
<!-- Note you can use space separated urls - they will be tried in turn until one works -->
|
||||
<!-- This could be used to authenticate against one or more ldap servers (you will not know which one ....) -->
|
||||
<entry key="java.naming.provider.url">
|
||||
<value>ldap://openldap.domain.com:389</value>
|
||||
<value>${ldap.authentication.java.naming.provider.url}</value>
|
||||
</entry>
|
||||
|
||||
<!-- The authentication mechanism to use -->
|
||||
@@ -69,390 +80,21 @@
|
||||
<!-- java.naming.security.sasl.realm -->
|
||||
<!-- The available options will depend on your LDAP provider -->
|
||||
<entry key="java.naming.security.authentication">
|
||||
<value>DIGEST-MD5</value>
|
||||
<value>${ldap.authentication.java.naming.security.authentication}</value>
|
||||
</entry>
|
||||
|
||||
<!-- The id of a user who can read group and user information -->
|
||||
<!-- This does not go through the pattern substitution defined above and is used "as is" -->
|
||||
<entry key="java.naming.security.principal">
|
||||
<value>reader</value>
|
||||
<value>${ldap.authentication.java.naming.security.principal}</value>
|
||||
</entry>
|
||||
|
||||
<!-- The password for the user defined above -->
|
||||
<entry key="java.naming.security.credentials">
|
||||
<value>secret</value>
|
||||
<value>${ldap.authentication.java.naming.security.credentials}</value>
|
||||
</entry>
|
||||
</map>
|
||||
</property>
|
||||
</bean>
|
||||
|
||||
<!-- Ldap Syncronisation support -->
|
||||
|
||||
<!--
|
||||
|
||||
There can be more than one stack of beans that import users or groups. For example, it may be easier
|
||||
to have a version of ldapPeopleExportSource, and associated beans, for each sub-tree of your ldap directory
|
||||
from which you want to import users. You could then limit users to be imported from two or more sub tress and ignore
|
||||
users found else where. The same applies to the import of groups.
|
||||
|
||||
The defaults shown below are for OpenLDAP.
|
||||
|
||||
-->
|
||||
|
||||
|
||||
<!-- Extract user information from LDAP and transform this to XML -->
|
||||
|
||||
<bean id="ldapPeopleExportSource" class="org.alfresco.repo.security.authentication.ldap.LDAPPersonExportSource">
|
||||
<!--
|
||||
The query to select objects that represent the users to import.
|
||||
|
||||
For Open LDAP, using a basic schema, the following is probably what you want:
|
||||
(objectclass=inetOrgPerson)
|
||||
|
||||
For Active Directory:
|
||||
(objectclass=user)
|
||||
-->
|
||||
<property name="personQuery">
|
||||
<value>(objectclass=inetOrgPerson)</value>
|
||||
</property>
|
||||
|
||||
<!--
|
||||
The seach base restricts the LDAP query to a sub section of tree on the LDAP server.
|
||||
-->
|
||||
<property name="searchBase">
|
||||
<value>dc=alfresco,dc=org</value>
|
||||
</property>
|
||||
|
||||
<!--
|
||||
The unique identifier for the user.
|
||||
|
||||
THIS MUST MATCH WHAT THE USER TYPES IN AT THE LOGIN PROMPT
|
||||
|
||||
For simple LDAP authentication this is likely to be "cn" or, less friendly, "distinguishedName"
|
||||
|
||||
In OpenLDAP, using other authentication mechanisms "uid", but this depends on how you map
|
||||
from the id in the LDAP authentication request to search for the inetOrgPerson against which
|
||||
to authenticate.
|
||||
|
||||
In Active Directory this is most likely to be "sAMAccountName"
|
||||
|
||||
This property is mandatory and must appear on all users found by the query defined above.
|
||||
|
||||
-->
|
||||
<property name="userIdAttributeName">
|
||||
<value>uid</value>
|
||||
</property>
|
||||
|
||||
<!-- Services -->
|
||||
<property name="LDAPInitialDirContextFactory">
|
||||
<ref bean="ldapInitialDirContextFactory"/>
|
||||
</property>
|
||||
<property name="personService">
|
||||
<ref bean="personService"></ref>
|
||||
</property>
|
||||
<property name="namespaceService">
|
||||
<ref bean="namespaceService"/>
|
||||
</property>
|
||||
|
||||
<!--
|
||||
This property defines a mapping between attributes held on LDAP user objects and
|
||||
the properties of user objects held in the repository. The key is the QName of an attribute in
|
||||
the repository, the value is the attribute name from the user/inetOrgPerson/.. object in the
|
||||
LDAP repository.
|
||||
-->
|
||||
<property name="attributeMapping">
|
||||
<map>
|
||||
<entry key="cm:userName">
|
||||
<!-- Must match the same attribute as userIdAttributeName -->
|
||||
<value>uid</value>
|
||||
</entry>
|
||||
<entry key="cm:firstName">
|
||||
<!-- OpenLDAP: "givenName" -->
|
||||
<!-- Active Directory: "givenName" -->
|
||||
<value>givenName</value>
|
||||
</entry>
|
||||
<entry key="cm:lastName">
|
||||
<!-- OpenLDAP: "sn" -->
|
||||
<!-- Active Directory: "sn" -->
|
||||
<value>sn</value>
|
||||
</entry>
|
||||
<entry key="cm:email">
|
||||
<!-- OpenLDAP: "mail" -->
|
||||
<!-- Active Directory: "???" -->
|
||||
<value>mail</value>
|
||||
</entry>
|
||||
<entry key="cm:organizationId">
|
||||
<!-- OpenLDAP: "o" -->
|
||||
<!-- Active Directory: "???" -->
|
||||
<value>o</value>
|
||||
</entry>
|
||||
<!-- Always use the default -->
|
||||
<entry key="cm:homeFolderProvider">
|
||||
<null/>
|
||||
</entry>
|
||||
</map>
|
||||
</property>
|
||||
<!-- Set a default home folder provider -->
|
||||
<!-- Defaults only apply for values above -->
|
||||
<property name="attributeDefaults">
|
||||
<map>
|
||||
<entry key="cm:homeFolderProvider">
|
||||
<value>personalHomeFolderProvider</value>
|
||||
</entry>
|
||||
</map>
|
||||
</property>
|
||||
</bean>
|
||||
|
||||
<!-- Extract group information from LDAP and transform this to XML -->
|
||||
|
||||
<bean id="ldapGroupExportSource" class="org.alfresco.repo.security.authentication.ldap.LDAPGroupExportSource">
|
||||
<!--
|
||||
The query to select objects that represent the groups to import.
|
||||
|
||||
For Open LDAP, using a basic schema, the following is probably what you want:
|
||||
(objectclass=groupOfNames)
|
||||
|
||||
For Active Directory:
|
||||
(objectclass=group)
|
||||
-->
|
||||
<property name="groupQuery">
|
||||
<value>(objectclass=groupOfNames)</value>
|
||||
</property>
|
||||
|
||||
<!--
|
||||
The seach base restricts the LDAP query to a sub section of tree on the LDAP server.
|
||||
-->
|
||||
<property name="searchBase">
|
||||
<value>dc=alfresco,dc=org</value>
|
||||
</property>
|
||||
|
||||
<!--
|
||||
The unique identifier for the user. This must match the userIdAttributeName on the ldapPeopleExportSource bean above.
|
||||
-->
|
||||
<property name="userIdAttributeName">
|
||||
<value>uid</value>
|
||||
</property>
|
||||
|
||||
<!--
|
||||
An attribute that is a unique identifier for each group found.
|
||||
This is also the name of the group with the current group implementation.
|
||||
This is mandatory for any groups found.
|
||||
|
||||
OpenLDAP: "cn" as it is mandatory on groupOfNames
|
||||
Active Directory: "cn"
|
||||
|
||||
-->
|
||||
<property name="groupIdAttributeName">
|
||||
<value>cn</value>
|
||||
</property>
|
||||
|
||||
<!--
|
||||
The objectClass attribute for group members.
|
||||
For each member of a group, the distinguished name is given.
|
||||
The object is looked up by its DN. If the object is of this class it is treated as a group.
|
||||
-->
|
||||
<property name="groupType">
|
||||
<value>groupOfNames</value>
|
||||
</property>
|
||||
|
||||
<!--
|
||||
The objectClass attribute for person members.
|
||||
For each member of a group, the distinguished name is given.
|
||||
The object is looked up by its DN. If the object is of this class it is treated as a person.
|
||||
-->
|
||||
<property name="personType">
|
||||
<value>inetOrgPerson</value>
|
||||
</property>
|
||||
<property name="LDAPInitialDirContextFactory">
|
||||
<ref bean="ldapInitialDirContextFactory"/>
|
||||
</property>
|
||||
<property name="namespaceService">
|
||||
<ref bean="namespaceService"/>
|
||||
</property>
|
||||
|
||||
<!--
|
||||
The repeating attribute on group objects (found by query or as sub groups)
|
||||
used to define membership of the group. This is assumed to hold distinguished names of
|
||||
other groups or users/people; the above types are used to determine this.
|
||||
|
||||
OpenLDAP: "member" as it is mandatory on groupOfNames
|
||||
Active Directory: "member"
|
||||
|
||||
-->
|
||||
<property name="memberAttribute">
|
||||
<value>member</value>
|
||||
</property>
|
||||
|
||||
<property name="authorityDAO">
|
||||
<ref bean="authorityDAO"/>
|
||||
</property>
|
||||
</bean>
|
||||
|
||||
<!-- Job definitions to import LDAP people and groups -->
|
||||
<!-- The triggers register themselves with the scheduler -->
|
||||
<!-- You may comment in the default scheduler to enable these triggers -->
|
||||
<!-- If a cron base trigger is what you want seee scheduled-jobs-context.xml for examples. -->
|
||||
|
||||
<!-- Trigger to load poeple -->
|
||||
<!-- Note you can have more than one initial (context, trigger, import job and export source) set -->
|
||||
<!-- This would allow you to load people from more than one ldap store -->
|
||||
|
||||
<bean id="ldapPeopleTrigger" class="org.alfresco.util.TriggerBean">
|
||||
<property name="jobDetail">
|
||||
<bean id="ldapPeopleJobDetail" class="org.springframework.scheduling.quartz.JobDetailBean">
|
||||
<property name="jobClass">
|
||||
<value>org.alfresco.repo.importer.ImporterJob</value>
|
||||
</property>
|
||||
<property name="jobDataAsMap">
|
||||
<map>
|
||||
<entry key="bean">
|
||||
<ref bean="ldapPeopleImport"/>
|
||||
</entry>
|
||||
</map>
|
||||
</property>
|
||||
</bean>
|
||||
</property>
|
||||
<!-- Start after 5 minutes of starting the repository -->
|
||||
<property name="startDelay">
|
||||
<value>300000</value>
|
||||
</property>
|
||||
<!-- Repeat every hour -->
|
||||
<property name="repeatInterval">
|
||||
<value>3600000</value>
|
||||
</property>
|
||||
<!-- Commented out to disable
|
||||
<property name="scheduler">
|
||||
<ref bean="schedulerFactory" />
|
||||
</property>
|
||||
-->
|
||||
</bean>
|
||||
|
||||
<bean id="ldapGroupTrigger" class="org.alfresco.util.TriggerBean">
|
||||
<property name="jobDetail">
|
||||
<bean id="ldapGroupJobDetail" class="org.springframework.scheduling.quartz.JobDetailBean">
|
||||
<property name="jobClass">
|
||||
<value>org.alfresco.repo.importer.ImporterJob</value>
|
||||
</property>
|
||||
<property name="jobDataAsMap">
|
||||
<map>
|
||||
<entry key="bean">
|
||||
<ref bean="ldapGroupImport"/>
|
||||
</entry>
|
||||
</map>
|
||||
</property>
|
||||
</bean>
|
||||
</property>
|
||||
<!-- Start after 5 minutes of starting the repository -->
|
||||
<property name="startDelay">
|
||||
<value>300000</value>
|
||||
</property>
|
||||
<!-- Repeat every hour -->
|
||||
<property name="repeatInterval">
|
||||
<value>3600000</value>
|
||||
</property>
|
||||
<!-- Commented out to disable
|
||||
<property name="scheduler">
|
||||
<ref bean="schedulerFactory" />
|
||||
</property>
|
||||
-->
|
||||
</bean>
|
||||
|
||||
<!-- The bean that imports xml describing people -->
|
||||
|
||||
<bean id="ldapPeopleImport" class="org.alfresco.repo.importer.ExportSourceImporter">
|
||||
<property name="importerService">
|
||||
<ref bean="importerComponentWithBehaviour"/>
|
||||
</property>
|
||||
<property name="transactionService">
|
||||
<ref bean="transactionComponent"/>
|
||||
</property>
|
||||
<property name="authenticationComponent">
|
||||
<ref bean="authenticationComponent"/>
|
||||
</property>
|
||||
<property name="exportSource">
|
||||
<ref bean="ldapPeopleExportSource"/>
|
||||
</property>
|
||||
|
||||
<!-- The store that contains people - this should not be changed -->
|
||||
<property name="storeRef">
|
||||
<value>${spaces.store}</value>
|
||||
</property>
|
||||
|
||||
<!-- The location of people nodes within the store defined above - this should not be changed -->
|
||||
<property name="path">
|
||||
<value>/${system.system_container.childname}/${system.people_container.childname}</value>
|
||||
</property>
|
||||
|
||||
<!-- If true, clear all existing people before import, if false update/add people from the xml -->
|
||||
<property name="clearAllChildren">
|
||||
<value>false</value>
|
||||
</property>
|
||||
<property name="nodeService">
|
||||
<ref bean="nodeService"/>
|
||||
</property>
|
||||
<property name="searchService">
|
||||
<ref bean="searchService"/>
|
||||
</property>
|
||||
<property name="namespacePrefixResolver">
|
||||
<ref bean="namespaceService"/>
|
||||
</property>
|
||||
|
||||
|
||||
<property name="caches">
|
||||
<set>
|
||||
<ref bean="permissionsAccessCache"/>
|
||||
</set>
|
||||
</property>
|
||||
</bean>
|
||||
|
||||
<!-- The bean that imports xml descibing groups -->
|
||||
|
||||
<bean id="ldapGroupImport" class="org.alfresco.repo.importer.ExportSourceImporter">
|
||||
<property name="importerService">
|
||||
<ref bean="importerComponentWithBehaviour"/>
|
||||
</property>
|
||||
<property name="transactionService">
|
||||
<ref bean="transactionComponent"/>
|
||||
</property>
|
||||
<property name="authenticationComponent">
|
||||
<ref bean="authenticationComponent"/>
|
||||
</property>
|
||||
<property name="exportSource">
|
||||
<ref bean="ldapGroupExportSource"/>
|
||||
</property>
|
||||
<!-- The store that contains group information - this should not be changed -->
|
||||
<property name="storeRef">
|
||||
<value>${alfresco_user_store.store}</value>
|
||||
</property>
|
||||
|
||||
<!-- The location of group information in the store above - this should not be changed -->
|
||||
<property name="path">
|
||||
<value>/${alfresco_user_store.system_container.childname}/${alfresco_user_store.authorities_container.childname}</value>
|
||||
</property>
|
||||
|
||||
<!-- If true, clear all existing groups before import, if false update/add groups from the xml -->
|
||||
<property name="clearAllChildren">
|
||||
<value>true</value>
|
||||
</property>
|
||||
<property name="nodeService">
|
||||
<ref bean="nodeService"/>
|
||||
</property>
|
||||
<property name="searchService">
|
||||
<ref bean="searchService"/>
|
||||
</property>
|
||||
<property name="namespacePrefixResolver">
|
||||
<ref bean="namespaceService"/>
|
||||
</property>
|
||||
|
||||
<!-- caches to clear on import of groups -->
|
||||
<property name="caches">
|
||||
<set>
|
||||
<ref bean="userToAuthorityCache"/>
|
||||
<ref bean="permissionsAccessCache"/>
|
||||
</set>
|
||||
</property>
|
||||
|
||||
<!-- userToAuthorityCache -->
|
||||
</bean>
|
||||
|
||||
</beans>
|
27
config/alfresco/extension/ldap-authentication.properties
Normal file
27
config/alfresco/extension/ldap-authentication.properties
Normal file
@@ -0,0 +1,27 @@
|
||||
#
|
||||
# This properties file brings together the common options for LDAP authentication rather than editing the bean definitions
|
||||
#
|
||||
|
||||
# How to map the user id entered by the user to taht passed through to LDAP
|
||||
# - simple
|
||||
# - this must be a DN and would be something like
|
||||
# CN=%s,DC=company,DC=com
|
||||
# - digest
|
||||
# - usually pass through what is entered
|
||||
# %s
|
||||
ldap.authentication.userNameFormat=%s
|
||||
|
||||
# The LDAP context factory to use
|
||||
ldap.authentication.java.naming.factory.initial=com.sun.jndi.ldap.LdapCtxFactory
|
||||
|
||||
# The URL to connect to the LDAP server
|
||||
ldap.authentication.java.naming.provider.url=ldap://openldap.domain.com:389
|
||||
|
||||
# The authentication mechanism to use
|
||||
ldap.authentication.java.naming.security.authentication=DIGEST-MD5
|
||||
|
||||
# The default principal to use (only used for LDAP sync)
|
||||
ldap.authentication.java.naming.security.principal=reader
|
||||
|
||||
# The password for the default principal (only used for LDAP sync)
|
||||
ldap.authentication.java.naming.security.credentials=secret
|
@@ -0,0 +1,377 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<!DOCTYPE beans PUBLIC '-//SPRING//DTD BEAN//EN' 'http://www.springframework.org/dtd/spring-beans.dtd'>
|
||||
|
||||
<beans>
|
||||
|
||||
<bean name="ldapSynchronisationPlaceholderConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
|
||||
<property name="ignoreUnresolvablePlaceholders">
|
||||
<value>true</value>
|
||||
</property>
|
||||
<property name="locations">
|
||||
<value>classpath:alfresco/extension/ldap-synchronisation.properties</value>
|
||||
</property>
|
||||
</bean>
|
||||
|
||||
<!--
|
||||
Wire up the same context as used for LDAP authentication. You could use another context: just replace this
|
||||
alias with the bean definition
|
||||
-->
|
||||
|
||||
<alias alias="ldapSyncInitialDirContextFactory" name="ldapInitialDirContextFactory"/>
|
||||
|
||||
<!-- Ldap Syncronisation support -->
|
||||
|
||||
<!--
|
||||
|
||||
There can be more than one stack of beans that import users or groups. For example, it may be easier
|
||||
to have a version of ldapPeopleExportSource, and associated beans, for each sub-tree of your ldap directory
|
||||
from which you want to import users. You could then limit users to be imported from two or more sub tress and ignore
|
||||
users found else where. The same applies to the import of groups.
|
||||
|
||||
The defaults shown below are for OpenLDAP.
|
||||
|
||||
-->
|
||||
|
||||
|
||||
<!-- Extract user information from LDAP and transform this to XML -->
|
||||
|
||||
<bean id="ldapPeopleExportSource" class="org.alfresco.repo.security.authentication.ldap.LDAPPersonExportSource">
|
||||
<!--
|
||||
The query to select objects that represent the users to import.
|
||||
|
||||
For Open LDAP, using a basic schema, the following is probably what you want:
|
||||
(objectclass=inetOrgPerson)
|
||||
|
||||
For Active Directory:
|
||||
(objectclass=user)
|
||||
-->
|
||||
<property name="personQuery">
|
||||
<value>${ldap.synchronisation.personQuery}</value>
|
||||
</property>
|
||||
|
||||
<!--
|
||||
The seach base restricts the LDAP query to a sub section of tree on the LDAP server.
|
||||
-->
|
||||
<property name="searchBase">
|
||||
<value>${ldap.synchronisation.personSearchBase}</value>
|
||||
</property>
|
||||
|
||||
<!--
|
||||
The unique identifier for the user.
|
||||
|
||||
THIS MUST MATCH WHAT THE USER TYPES IN AT THE LOGIN PROMPT
|
||||
|
||||
For simple LDAP authentication this is likely to be "cn" or, less friendly, "distinguishedName"
|
||||
|
||||
In OpenLDAP, using other authentication mechanisms "uid", but this depends on how you map
|
||||
from the id in the LDAP authentication request to search for the inetOrgPerson against which
|
||||
to authenticate.
|
||||
|
||||
In Active Directory this is most likely to be "sAMAccountName"
|
||||
|
||||
This property is mandatory and must appear on all users found by the query defined above.
|
||||
|
||||
-->
|
||||
<property name="userIdAttributeName">
|
||||
<value>${ldap.synchronisation.userIdAttributeName]</value>
|
||||
</property>
|
||||
|
||||
<!-- Services -->
|
||||
<property name="LDAPInitialDirContextFactory">
|
||||
<ref bean="ldapSyncInitialDirContextFactory"/>
|
||||
</property>
|
||||
<property name="personService">
|
||||
<ref bean="personService"></ref>
|
||||
</property>
|
||||
<property name="namespaceService">
|
||||
<ref bean="namespaceService"/>
|
||||
</property>
|
||||
|
||||
<!--
|
||||
This property defines a mapping between attributes held on LDAP user objects and
|
||||
the properties of user objects held in the repository. The key is the QName of an attribute in
|
||||
the repository, the value is the attribute name from the user/inetOrgPerson/.. object in the
|
||||
LDAP repository.
|
||||
-->
|
||||
<property name="attributeMapping">
|
||||
<map>
|
||||
<entry key="cm:userName">
|
||||
<!-- Must match the same attribute as userIdAttributeName -->
|
||||
<value>${ldap.synchronisation.userIdAttributeName}</value>
|
||||
</entry>
|
||||
<entry key="cm:firstName">
|
||||
<!-- OpenLDAP: "givenName" -->
|
||||
<!-- Active Directory: "givenName" -->
|
||||
<value>${ldap.synchronisation.userFirstNameAttributeName}</value>
|
||||
</entry>
|
||||
<entry key="cm:lastName">
|
||||
<!-- OpenLDAP: "sn" -->
|
||||
<!-- Active Directory: "sn" -->
|
||||
<value>${ldap.synchronisation.userLastNameAttributeName}</value>
|
||||
</entry>
|
||||
<entry key="cm:email">
|
||||
<!-- OpenLDAP: "mail" -->
|
||||
<!-- Active Directory: "???" -->
|
||||
<value>${ldap.synchronisation.userEmailAttributeName}</value>
|
||||
</entry>
|
||||
<entry key="cm:organizationId">
|
||||
<!-- OpenLDAP: "o" -->
|
||||
<!-- Active Directory: "???" -->
|
||||
<value>${ldap.synchronisation.userOrganizationalIdAttributeName}</value>
|
||||
</entry>
|
||||
<!-- Always use the default -->
|
||||
<entry key="cm:homeFolderProvider">
|
||||
<null/>
|
||||
</entry>
|
||||
</map>
|
||||
</property>
|
||||
<!-- Set a default home folder provider -->
|
||||
<!-- Defaults only apply for values above -->
|
||||
<property name="attributeDefaults">
|
||||
<map>
|
||||
<entry key="cm:homeFolderProvider">
|
||||
<value>${ldap.synchronisation.defaultHomeFolderProvider}</value>
|
||||
</entry>
|
||||
</map>
|
||||
</property>
|
||||
</bean>
|
||||
|
||||
<!-- Extract group information from LDAP and transform this to XML -->
|
||||
|
||||
<bean id="ldapGroupExportSource" class="org.alfresco.repo.security.authentication.ldap.LDAPGroupExportSource">
|
||||
<!--
|
||||
The query to select objects that represent the groups to import.
|
||||
|
||||
For Open LDAP, using a basic schema, the following is probably what you want:
|
||||
(objectclass=groupOfNames)
|
||||
|
||||
For Active Directory:
|
||||
(objectclass=group)
|
||||
-->
|
||||
<property name="groupQuery">
|
||||
<value>${ldap.synchronisation.groupQuery}</value>
|
||||
</property>
|
||||
|
||||
<!--
|
||||
The seach base restricts the LDAP query to a sub section of tree on the LDAP server.
|
||||
-->
|
||||
<property name="searchBase">
|
||||
<value>${ldap.synchronisation.groupSearchBase}</value>
|
||||
</property>
|
||||
|
||||
<!--
|
||||
The unique identifier for the user. This must match the userIdAttributeName on the ldapPeopleExportSource bean above.
|
||||
-->
|
||||
<property name="userIdAttributeName">
|
||||
<value>${ldap.synchronisation.userIdAttributeName}</value>
|
||||
</property>
|
||||
|
||||
<!--
|
||||
An attribute that is a unique identifier for each group found.
|
||||
This is also the name of the group with the current group implementation.
|
||||
This is mandatory for any groups found.
|
||||
|
||||
OpenLDAP: "cn" as it is mandatory on groupOfNames
|
||||
Active Directory: "cn"
|
||||
|
||||
-->
|
||||
<property name="groupIdAttributeName">
|
||||
<value>${ldap.synchronisation.groupIdAttributeName}</value>
|
||||
</property>
|
||||
|
||||
<!--
|
||||
The objectClass attribute for group members.
|
||||
For each member of a group, the distinguished name is given.
|
||||
The object is looked up by its DN. If the object is of this class it is treated as a group.
|
||||
-->
|
||||
<property name="groupType">
|
||||
<value>${ldap.synchronisation.groupType}</value>
|
||||
</property>
|
||||
|
||||
<!--
|
||||
The objectClass attribute for person members.
|
||||
For each member of a group, the distinguished name is given.
|
||||
The object is looked up by its DN. If the object is of this class it is treated as a person.
|
||||
-->
|
||||
<property name="personType">
|
||||
<value>${ldap.synchronisation.personType}</value>
|
||||
</property>
|
||||
<property name="LDAPInitialDirContextFactory">
|
||||
<ref bean="ldapSyncInitialDirContextFactory"/>
|
||||
</property>
|
||||
<property name="namespaceService">
|
||||
<ref bean="namespaceService"/>
|
||||
</property>
|
||||
|
||||
<!--
|
||||
The repeating attribute on group objects (found by query or as sub groups)
|
||||
used to define membership of the group. This is assumed to hold distinguished names of
|
||||
other groups or users/people; the above types are used to determine this.
|
||||
|
||||
OpenLDAP: "member" as it is mandatory on groupOfNames
|
||||
Active Directory: "member"
|
||||
|
||||
-->
|
||||
<property name="memberAttribute">
|
||||
<value>${ldap.synchronisation.groupMemberAttributeName}</value>
|
||||
</property>
|
||||
|
||||
<property name="authorityDAO">
|
||||
<ref bean="authorityDAO"/>
|
||||
</property>
|
||||
</bean>
|
||||
|
||||
<!-- Job definitions to import LDAP people and groups -->
|
||||
<!-- The triggers register themselves with the scheduler -->
|
||||
<!-- You may comment in the default scheduler to enable these triggers -->
|
||||
<!-- If a cron base trigger is what you want seee scheduled-jobs-context.xml for examples. -->
|
||||
|
||||
<!-- Trigger to load poeple -->
|
||||
<!-- Note you can have more than one initial (context, trigger, import job and export source) set -->
|
||||
<!-- This would allow you to load people from more than one ldap store -->
|
||||
|
||||
<bean id="ldapPeopleTrigger" class="org.alfresco.util.CronTriggerBean">
|
||||
<property name="jobDetail">
|
||||
<bean id="ldapPeopleJobDetail" class="org.springframework.scheduling.quartz.JobDetailBean">
|
||||
<property name="jobClass">
|
||||
<value>org.alfresco.repo.importer.ImporterJob</value>
|
||||
</property>
|
||||
<property name="jobDataAsMap">
|
||||
<map>
|
||||
<entry key="bean">
|
||||
<ref bean="ldapPeopleImport"/>
|
||||
</entry>
|
||||
</map>
|
||||
</property>
|
||||
</bean>
|
||||
</property>
|
||||
<property name="cronExpression">
|
||||
<value>${ldap.synchronisation.import.person.cron}</value>
|
||||
</property>
|
||||
<property name="scheduler">
|
||||
<ref bean="schedulerFactory" />
|
||||
</property>
|
||||
</bean>
|
||||
|
||||
<bean id="ldapGroupTrigger" class="org.alfresco.util.CronTriggerBean">
|
||||
<property name="jobDetail">
|
||||
<bean id="ldapGroupJobDetail" class="org.springframework.scheduling.quartz.JobDetailBean">
|
||||
<property name="jobClass">
|
||||
<value>org.alfresco.repo.importer.ImporterJob</value>
|
||||
</property>
|
||||
<property name="jobDataAsMap">
|
||||
<map>
|
||||
<entry key="bean">
|
||||
<ref bean="ldapGroupImport"/>
|
||||
</entry>
|
||||
</map>
|
||||
</property>
|
||||
</bean>
|
||||
</property>
|
||||
<property name="cronExpression">
|
||||
<value>${ldap.synchronisation.import.group.cron}</value>
|
||||
</property>
|
||||
<property name="scheduler">
|
||||
<ref bean="schedulerFactory" />
|
||||
</property>
|
||||
</bean>
|
||||
|
||||
<!-- The bean that imports xml describing people -->
|
||||
|
||||
<bean id="ldapPeopleImport" class="org.alfresco.repo.importer.ExportSourceImporter">
|
||||
<property name="importerService">
|
||||
<ref bean="importerComponentWithBehaviour"/>
|
||||
</property>
|
||||
<property name="transactionService">
|
||||
<ref bean="transactionComponent"/>
|
||||
</property>
|
||||
<property name="authenticationComponent">
|
||||
<ref bean="authenticationComponent"/>
|
||||
</property>
|
||||
<property name="exportSource">
|
||||
<ref bean="ldapPeopleExportSource"/>
|
||||
</property>
|
||||
|
||||
<!-- The store that contains people - this should not be changed -->
|
||||
<property name="storeRef">
|
||||
<value>${spaces.store}</value>
|
||||
</property>
|
||||
|
||||
<!-- The location of people nodes within the store defined above - this should not be changed -->
|
||||
<property name="path">
|
||||
<value>/${system.system_container.childname}/${system.people_container.childname}</value>
|
||||
</property>
|
||||
|
||||
<!-- If true, clear all existing people before import, if false update/add people from the xml -->
|
||||
<property name="clearAllChildren">
|
||||
<value>false</value>
|
||||
</property>
|
||||
<property name="nodeService">
|
||||
<ref bean="nodeService"/>
|
||||
</property>
|
||||
<property name="searchService">
|
||||
<ref bean="searchService"/>
|
||||
</property>
|
||||
<property name="namespacePrefixResolver">
|
||||
<ref bean="namespaceService"/>
|
||||
</property>
|
||||
|
||||
|
||||
<property name="caches">
|
||||
<set>
|
||||
<ref bean="permissionsAccessCache"/>
|
||||
</set>
|
||||
</property>
|
||||
</bean>
|
||||
|
||||
<!-- The bean that imports xml descibing groups -->
|
||||
|
||||
<bean id="ldapGroupImport" class="org.alfresco.repo.importer.ExportSourceImporter">
|
||||
<property name="importerService">
|
||||
<ref bean="importerComponentWithBehaviour"/>
|
||||
</property>
|
||||
<property name="transactionService">
|
||||
<ref bean="transactionComponent"/>
|
||||
</property>
|
||||
<property name="authenticationComponent">
|
||||
<ref bean="authenticationComponent"/>
|
||||
</property>
|
||||
<property name="exportSource">
|
||||
<ref bean="ldapGroupExportSource"/>
|
||||
</property>
|
||||
<!-- The store that contains group information - this should not be changed -->
|
||||
<property name="storeRef">
|
||||
<value>${alfresco_user_store.store}</value>
|
||||
</property>
|
||||
|
||||
<!-- The location of group information in the store above - this should not be changed -->
|
||||
<property name="path">
|
||||
<value>/${alfresco_user_store.system_container.childname}/${alfresco_user_store.authorities_container.childname}</value>
|
||||
</property>
|
||||
|
||||
<!-- If true, clear all existing groups before import, if false update/add groups from the xml -->
|
||||
<property name="clearAllChildren">
|
||||
<value>${ldap.synchronisation.import.group.clearAllChildren}</value>
|
||||
</property>
|
||||
<property name="nodeService">
|
||||
<ref bean="nodeService"/>
|
||||
</property>
|
||||
<property name="searchService">
|
||||
<ref bean="searchService"/>
|
||||
</property>
|
||||
<property name="namespacePrefixResolver">
|
||||
<ref bean="namespaceService"/>
|
||||
</property>
|
||||
|
||||
<!-- caches to clear on import of groups -->
|
||||
<property name="caches">
|
||||
<set>
|
||||
<ref bean="userToAuthorityCache"/>
|
||||
<ref bean="permissionsAccessCache"/>
|
||||
</set>
|
||||
</property>
|
||||
|
||||
<!-- userToAuthorityCache -->
|
||||
</bean>
|
||||
|
||||
</beans>
|
59
config/alfresco/extension/ldap-synchronisation.properties
Normal file
59
config/alfresco/extension/ldap-synchronisation.properties
Normal file
@@ -0,0 +1,59 @@
|
||||
#
|
||||
# This properties file is used to configure LDAP syncronisation
|
||||
#
|
||||
|
||||
# The query to find the people to import
|
||||
ldap.synchronisation.personQuery=(objectclass=inetOrgPerson)
|
||||
|
||||
# The search base of the query to find people to import
|
||||
ldap.synchronisation.personSearchBase=dc=company,dc=com
|
||||
|
||||
# The attribute name on people objects found in LDAP to use as the uid in Alfresco
|
||||
ldap.synchronisation.userIdAttributeName=uid
|
||||
|
||||
# The attribute on person objects in LDAP to map to the first name property in Alfresco
|
||||
ldap.synchronisation.userFirstNameAttributeName=givenName
|
||||
|
||||
# The attribute on person objects in LDAP to map to the last name property in Alfresco
|
||||
ldap.synchronisation.userLastNameAttributeName=sn
|
||||
|
||||
# The attribute on person objects in LDAP to map to the email property in Alfresco
|
||||
ldap.synchronisation.userEmailAttributeName=mail
|
||||
|
||||
# The attribute on person objects in LDAP to map to the organizational id property in Alfresco
|
||||
ldap.synchronisation.userOrganizationalIdAttributeName=o
|
||||
|
||||
# The default home folder provider to use for people created via LDAP import
|
||||
ldap.synchronisation.defaultHomeFolderProvider=personalHomeFolderProvider
|
||||
|
||||
# The query to find group objects
|
||||
ldap.synchronisation.groupQuery=(objectclass=groupOfNames)
|
||||
|
||||
# The search base to use to find group objects
|
||||
ldap.synchronisation.groupSearchBase=dc=company,dc=com
|
||||
|
||||
# The attribute on LDAP group objects to map to the gid property in Alfrecso
|
||||
ldap.synchronisation.groupIdAttributeName=cn
|
||||
|
||||
# The group type in LDAP
|
||||
ldap.synchronisation.groupType=groupOfNames
|
||||
|
||||
# The person type in LDAP
|
||||
ldap.synchronisation.personType=inetOrgPerson
|
||||
|
||||
# The attribute in LDAP on group objects that defines the DN for its members
|
||||
ldap.synchronisation.groupMemberAttributeName=member
|
||||
|
||||
# The cron expression defining when people imports should take place
|
||||
ldap.synchronisation.import.person.cron=0 0 * * * ?
|
||||
|
||||
# The cron expression defining when group imports should take place
|
||||
ldap.synchronisation.import.group.cron=0 30 * * * ?
|
||||
|
||||
# Should all groups be cleared out at import time?
|
||||
# - this is safe as groups are not used in Alfresco for other things (unlike person objects which you should never clear out during an import)
|
||||
# - setting this to true means old group definitions will be tidied up.
|
||||
ldap.synchronisation.import.group.clearAllChildren=true
|
||||
|
||||
|
||||
|
@@ -219,6 +219,7 @@
|
||||
<mandatory>false</mandatory>
|
||||
<many>true</many>
|
||||
</target>
|
||||
<duplicate>false</duplicate>
|
||||
</child-association>
|
||||
</associations>
|
||||
</type>
|
||||
|
@@ -7,10 +7,13 @@
|
||||
<ref bean="nodeService"/>
|
||||
</property>
|
||||
<property name="authenticationService">
|
||||
<ref bean="authenticationServiceImpl"/>
|
||||
<ref bean="authenticationService"/>
|
||||
</property>
|
||||
<property name="nodeOwnerCache">
|
||||
<ref bean="nodeOwnerCache"/>
|
||||
</property>
|
||||
<property name="policyComponent">
|
||||
<ref bean="policyComponent" />
|
||||
</property>
|
||||
</bean>
|
||||
</beans>
|
@@ -204,7 +204,7 @@
|
||||
<ref bean="nodeService"></ref>
|
||||
</property>
|
||||
<property name="authenticationService">
|
||||
<ref bean="authenticationServiceImpl" />
|
||||
<ref bean="authenticationService" />
|
||||
</property>
|
||||
<property name="maxPermissionCheckTimeMillis">
|
||||
<value>${system.acl.maxPermissionCheckTimeMillis}</value>
|
||||
|
@@ -101,6 +101,9 @@
|
||||
<property name="nodeService">
|
||||
<ref bean="nodeService"/>
|
||||
</property>
|
||||
<property name="contentService">
|
||||
<ref bean="contentService"/>
|
||||
</property>
|
||||
<property name="authenticationComponent">
|
||||
<ref bean="authenticationComponent"/>
|
||||
</property>
|
||||
@@ -166,7 +169,7 @@
|
||||
</property>
|
||||
</bean>
|
||||
|
||||
<bean id="on-content-update-trigger" class="org.alfresco.repo.rule.ruletrigger.OnContentUpdateRuleTrigger" parent="rule-trigger-base">
|
||||
<bean id="on-content-update-trigger" class="org.alfresco.repo.rule.ruletrigger.OnContentUpdateRuleTrigger" parent="rule-trigger-base">
|
||||
<property name="onNewContent">
|
||||
<value>false</value>
|
||||
</property>
|
||||
|
Reference in New Issue
Block a user