Obsolete Pages{{Obsolete}}
The official documentation is at: http://docs.alfresco.com
SecurityAuthentication
2.x3.03.1
This page describes configuration methods prior to Alfresco Version 3.2. Refer to Alfresco Authentication Subsystems for Alfresco Versions 3.2 and up.
There are a number of entry points to the repository that all carry out authentication. A number of these require matching and/or supported configurations.
The entry points are:
The default set of services wired up to authentication components changes from time to time.
The example configurations and Alfresco configuration will be updated to reflect this.
3.0 authentication components require the
The requirement for the tenant service is new in 3.0.
In future these services will all be defined via an abstract base bean and wired up using:
parent='authenticationComponentBase'>
Currently, this base bean only contains the tenant service.
If for instance you chain Alfresco and NTLM, by default only the first compatible authentication component in the chain will be used for CIFS, here alfresco. If you want to force the seond component (NTLM), you need to set the property ntlmMode to PASS_THROUGH for the ChainingAuthenticationComponentImpl bean.
<property name='ntlmMode'>
<value>PASS_THROUGH</value>
</property>
Note: the reason why only one CIFS request can be made comes from the protocol. Alfresco may only get one logon request from the client before it fails and the password is hashed in the case of NTLM (for CIFS or HTTP).
Alfresco default authentication
Notes:
| Active Directory - LDAP
| Active Directory - Kerberos
Notes:
| LDAP Server
Notes:
|
Active Directory - SSO - NTLM
| SSO - Kerberos
| SSO - SiteMinder, IChains, CAS and the like
See Central Authentication Service Configuration for information about configuring Alfresco to work with CAS |
The community and enterprise products both support enterprise authentication as described on this page.
A Kerberos setup is detailed at Configuring_the_CIFS_and_web_servers_for_Kerberos/AD_integration and does not need JAAS.
The JAAS Authentication component is used most commonly within Alfresco to support Kerberos authentication of user names and passwords. You may choose to use Kerberos against an Active Directory server in preference to LDAP or NTLM as it provides strong encryption without using SSL. It is still possible to use LDAP synchronisation to extract user information.
The disadvantages of using LDAP authentication against Active Directory compared with JAAS/Kerberos are:
IE exposes NTLMv1, NTLMv2 and Kerberos SSO support - but has to be configured correctly on the browser. The web authentication filters for the UI and WebDav support NTLMv1 and as of 3.0 support NTLMv2 for authentication components that can provide the MD4 password hash. From 2.2/3.0, Kerberos SSO is supported via the UI and WebDAV. A full kerberos authentication configuration is possible with the JAAS authentication component (except for how FTP transmits plain text passwords and how LDAP user synchronisation sends passwords)
Some of the configuration is common between CIFS Kerberos authentication and the UI and WebDAV Kerberos based authentication filters. If you have full SSO support it is likely that you do not want the JAAS authentication component configured in. Instead you probably want to reject all authentication that is not Kerberos ticket based - the users should already be authenticated.
For some pointers and background information on JAAS, the Java Authentication and Authorization Service, please see:
To use JAAS authentication with Alfresco, you must:
Note: Please read the page on how to override configuration settings in the repository. You should configure the security and authentication components without changing any of the files contained in the Alfresco distributions.
For JAAS authentication you can configure:
The beans are defined by overriding the authenticationComponentImpl bean upto and including V1.4 and the authenticationComponent from V2.0 on. A sample config can be found in <configRoot>/alfresco/extension/jaas-authentication-context.xml.sample. This is always the best place to start.
Here is the 2.1 config.
<beans>
<bean id='authenticationComponent'
class='org.alfresco.repo.security.authentication.jaas.JAASAuthenticationComponent'>
<property name='realm'>
<value>DEFAULT.REALM</value>
</property>
<property name='jaasConfigEntryName'>
<value>Alfresco</value>
</property>
</bean>
<bean name='authenticationDao' class='org.alfresco.repo.security.authentication.DefaultMutableAuthenticationDao' >
<property name='allowDeleteUser'>
<value>true</value>
</property>
</bean>
</beans>
The remainder of the example will describe how to configure a Kerberos 5 authentication mechanism that will support this definition. It was tested against Active Directory.
The location of the login config must be defined first.
This can be done on the command line using system properties or it can be defined in the security configuration.
The configuration defines which authentication mechanisms must be in place and succeed for authentication to take place.
By default, the location of the login configuration can be set in the JRE java.security file,
found in somewhere like C:\Program Files\Java\jdk1.5.0_04\jre\lib\security for windows.
If not, the location of the login configuration can be specified on the java command line using the -Djava.security.auth.login.config=c:\path\file.conf
To add the configuration to the java.security file, add a line:
login.config.url.1=file:${java.home}/lib/security/java.login.config
This will configure JAAS to look for the java.login.config file in the same directory as the java.security file.
The java.login.config file should contain something like:
Alfresco {
com.sun.security.auth.module.Krb5LoginModule sufficient;
};
com.sun.net.ssl.client {
com.sun.security.auth.module.Krb5LoginModule sufficient;
};
other {
com.sun.security.auth.module.Krb5LoginModule sufficient;
};
This configures Alfresco to require kerberos. There are many more options for the Krb5LoginModule.
Here it is assumed you have a simple configuration and are setting up a machine just to connect to existing Kerberos support, such as Active Directory.
MIT Docs
Kerberos: The Network Authentication Protocol
http://web.mit.edu/kerberos
Microsoft docs
Kerberos Authentication in Windows Server 2003 http://technet2.microsoft.com/windowsserver/en/technologies/featured/kerberos/default.mspx
Kerberos Authentication in Windows 2000 Server
http://www.microsoft.com/technet/prodtechnol/windows2000serv/technologies/security/kerberos/default....
Troubleshooting Kerberos
http://technet2.microsoft.com/WindowsServer/en/library/26ce2e7f-52d6-4425-88cc-1573bc5e646d1033.mspx
Setting the kerberos configuration can be done from the java command line, using system variables, or using a kerberos config file. This section describes using a config file.
The default locations for the config file are:
At the minimum, the kerberos config file contains something like
[libdefaults]
default_realm = COMPANY.COM
[realms]
COMPANY.COM = {
kdc = activeDirectoryHost.company.com
admin_server = activeDirectoryHost.company.com
}
[domain_realm]
company.com = COMPANY.COM
.company.com = COMPANY.COM
You can also set these parameters on the command line. See the GSS-API tutorials for mode details.
You can check the configuration files are correct and you can get a kerberos ticket using the commands kinit and klist. Note, at least on the windows xp version, kinit may echo your password to the screen - seems to fixed in XP somewhere along the line. kinit will get a kerberos ticket. klist will show you the tickets.
There are some problems according to usernames and case sensitivity.
If the loginname is User@COMPANY.COM authentication will fail if you use user@COMPANY.COM.
Take a look at this page Thread 'Using Java client with Windows 2003 AD with mixed case PrincipalNames' --Mobang 10:03, 2 August 2006 (BST)
You should be able to login via the web client using kerberos.
LDAP can be used for user authentication and to obtain user information. They do not have to be used together. LDAP authentication can be used without pulling in personal information using LDAP synchronisation - default entries would be created by the PersonService. LDAP synchronisation of personal information is most likely to be used in conjunction with LDAP authentication. LDAP personal information sychronisation can also be used with other authentication mechanisms: e.g. JAAS/Kerberos against Active Directory, NTLM against ActiveDirectory, and possibly other combinations such as NTLM using Samba on top of open LDAP.
There are three parts to LDAP configuration:
Authentication and LDAP import are likely to use the same LDAP context to connect to the LDAP server.
A template configuration is provided in alfresco/extensions/extension/ldap-authentication-context.xml.sample.
It is best to get LDAP simple authentication up and running first and then set up the export and synchronisation of groups and people, followed by more complex authentication requirements.
After 2.1 LDAP configuration is split into authentication and synchronisation. The configuration of both is simplified and less error prone with the use of properties files. There should be no reason to edit the xml for most use cases. It is also simpler to configure LDAP as part of chaining authentication.
Active Directory supports LDAP based authentication. It can also support authentication using JAAS+Kerberos (see above) and NTLM authentication. NTLM is the only solution that will give you single sign on. It is possible to use any of these authentication methods against an ActiveDirectory server and extract user and group information via LDAP.
Note that active directory allows two formats in the bind expressions:
see for instance http://www.microsoft.com/technet/scriptcenter/resources/qanda/dec04/hey1206.mspx
Unless you have synchronized OpenLDAP with another authentication system you only have LDAP based authentication available.
Note that openlodap support only one format for the bind expression: the full DN (Distinguished Name).
Using an LDAP browser, such as the one from Softerra, check the values of the supportedSASLMechanisms attributes on the root node of your LDAP server. Note: the 'simple' authentication method will not be reported as it is not a SASL mechanism.
If you use openldap, you can also query using ldapsearch:
ldapsearch -h localhost -p 389 -x -b '' -s base -LLL supportedSASLMechanisms
dn:
supportedSASLMechanisms: DIGEST-MD5
supportedSASLMechanisms: NTLM
supportedSASLMechanisms: CRAM-MD5
The LDAP connection configuration is defined in the ldapInitialDirContextFactory bean.
This bean wraps the creation of an intial directory context for LDAP.
You can set any LDAP related or SASL related property that you would be able to set using the Java API. For more configuration, see The full list of LDAP properties and more gory details for LDAP providers and Parameters for SASL.
The authentication credentials (principal and password) in this bean are only used for extracting user and group information from the LDAP server. The other options, including realm, are used if this bean is injected into LDAP authentication.
Note: LDAP servers may have a maximum request size (e.g. no more than 1000 entries). This could be an issue if you try to import a large amount of people or groups. This restriction should be removed on the LDAP server
This example illustrates the basic options:
<bean id='authenticationComponentImpl' class='org.alfresco.repo.security.authentication.ldap.LDAPAuthenticationComponentImpl'>
<property name='LDAPInitialDirContextFactory'>
<ref bean='ldapInitialDirContextFactory' />
</property>
<property name='userNameFormat'>
<value>%s</value>
</property>
</bean>
<bean id='ldapInitialDirContextFactory' class='org.alfresco.repo.security.authentication.ldap.LDAPInitialDirContextFactoryImpl'>
<property name='initialDirContextEnvironment'>
<map>
<entry key='java.naming.factory.initial'>
<value>com.sun.jndi.ldap.LdapCtxFactory</value>
</entry>
<entry key='java.naming.provider.url'>
<value>ldap://openldap.domain.com:389</value>
</entry>
<entry key='java.naming.security.authentication'>
<value>DIGEST-MD5</value>
</entry>
<entry key='java.naming.security.principal'>
<value>reader</value>
</entry>
<entry key='java.naming.security.credentials'>
<value>secret</value>
</entry>
</map>
</property>
</bean>
Note that this authentication mechanism sends user names and passwords in plain text. However, it is the most simple to set up. This is supported by both Active Directory and OpenLDAP.
You may be able to add SSL for secure access, otherwise this should only be used for testing.
For simple LDAP Authentication the full distinguished name of the user is required, along with their password. This can take many forms depending on how the LDAP repository has been structured. The user is required to type in some kind of user identifier which is then translated into a distinguished name. This transformation is set on the authenticationComponent bean using the userNameFormat property. The %s is replaced with whatever the user types in as their userid on the login screen.
The most simple example is the when the user must enter their distinguished name.
...
<property name='userNameFormat'>
<value>%s</value>
</property>
....
If users are in a well known place in the LDAP repository tree structure then users only need to enter their common name (by convention the person's full name).
...
<property name='userNameFormat'>
<value>cn=%s,dc=company,dc=com</value>
</property>
....
This is the default authentication mechanism that should be supported by all LDAP servers.
Active Directory does not support this, but it does support Kerberos authentication which you could use in combination with the synchronisation config.
The digest authentication mechanism (usually) requires users to enter their 'uid' as stored in LDAP, but could be configured in other ways. In any case, the identity provided by the user in the login screen needs to be passed through unchanged to the LDAP authentication mechanism using the configuration snippet below for the authenticationComponentImpl bean.
...
<property name='userNameFormat'>
<value>%s</value>
</property>
....
Synchronization of people and groups between the Alfresco repository and LDAP is supported by scheduled jobs. These jobs extract the user or group information from the LDAP repository and create the appropriate information as an Alfresco import xml file. This file is then imported into the repository.
Information can be extracted from Active Directory. Because only Kerberos authentication is available for active directory and some of the oddities of LDAP/SASL/JAAS configuration it is simpler to configure Jaas direct for authentication against Active Directory and have a simple or simple + ssl read only user access. As mentioned below, it may be possible to configure Kerberos authentication for this use case.
The ldap configuration example includes all the new bean definitions to support this.
This uses:
The configuration assumes that people are stored in LDAP as inetOrgPerson objects but can be changed to match the 'user' type in Active Directory. The details are in the sample configuration file.
The ldapPeopleExportSource bean is defined as:
<bean id='ldapPeopleExportSource' class='org.alfresco.repo.security.authentication.ldap.LDAPPersonExportSource'>
<property name='personQuery'>
<value>(objectclass=inetOrgPerson)</value>
</property>
<property name='searchBase'>
<value>dc=company,dc=com</value>
</property>
<property name='userIdAttributeName'>
<value>cn</value>
</property>
<property name='LDAPInitialDirContextFactory'>
<ref bean='ldapInitialDirContextFactory' />
</property>
<property name='personService'>
<ref bean='personService'></ref>
</property>
<property name='namespaceService'>
<ref bean='namespaceService' />
</property>
<property name='defaultHomeFolder'>
<value>/app:company_home</value>
</property>
<property name='attributeMapping'>
<map>
<entry key='cm:userName'>
<value>cn</value>
</entry>
<entry key='cm:firstName'>
<value>givenName</value>
</entry>
<entry key='cm:lastName'>
<value>sn</value>
</entry>
<entry key='cm:email'>
<value>mail</value>
</entry>
<entry key='cm:organizationId'>
<value>o</value>
</entry>
</map>
</property>
</bean>
The configuration options are:
The bean that imports this information is defined as
<bean id='ldapPeopleImport' class='org.alfresco.repo.importer.ExportSourceImporter'>
<property name='importerService'>
<ref bean='importerComponent' />
</property>
<property name='transactionService'>
<ref bean='transactionComponent'/>
</property>
<property name='authenticationComponent'>
<ref bean='authenticationComponent' />
</property>
<property name='exportSource'>
<ref bean='ldapPeopleExportSource' />
</property>
<property name='storeRef'>
<value>${spaces.store}</value>
</property>
<property name='path'>
<value>/${system.system_container.childname}/${system.people_container.childname}</value>
</property>
<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>
</bean>
The important configuration parameters are:
The import will follow the 'update existing' semantics of the import process.
The schedule for extraction and synchronisation is defined in
<bean id='ldapPeopleTrigger' class='org.springframework.scheduling.quartz.SimpleTriggerBean'>
<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='startDelay'>
<value>30000</value>
</property>
<property name='repeatInterval'>
<value>3600000</value>
</property>
</bean>
It is wired up to the scheduler in
<bean id='schedulerFactory' class='org.springframework.scheduling.quartz.SchedulerFactoryBean'>
<property name='triggers'>
<list>
<ref bean='tempFileCleanerTrigger' />
<ref bean='ftsIndexerTrigger' />
<ref bean='indexRecoveryTrigger' />
<ref bean='indexBackupTrigger' />
</list>
</property>
<property name='waitForJobsToCompleteOnShutdown'>
<value>true</value>
</property>
<property name='configLocation'>
<value>classpath:alfresco/domain/quartz.properties</value>
</property>
</bean>
Note: this will change at some point when the scheduler is injected into a trigger, as opposed to the reverse, as now.
It has been assumed that groups are stored in LDAP as an object that has a repeating attribute which defines the distinguished names of other groups, or users. This is supported in the standard LDAP schema using the groupOfNames type. This is used in the example configuration. The sample xml file in the distribution has Active Directory settings.
Note: The import of groups will fail when you try to import an empty group (I only tested this in the Enterprise 1.2 release). This issue should be solved in the next release.
<bean id='ldapGroupExportSource' class='org.alfresco.repo.security.authentication.ldap.LDAPGroupExportSource'>
<property name='groupQuery'>
<value>(objectclass=groupOfNames)</value>
</property>
<property name='searchBase'>
<value>dc=company,dc=com</value>
</property>
<property name='userIdAttributeName'>
<value>uid</value>
</property>
<property name='groupIdAttributeName'>
<value>cn</value>
</property>
<property name='groupType'>
<value>groupOfNames</value>
</property>
<property name='personType'>
<value>inetOrgPerson</value>
</property>
<property name='LDAPInitialDirContextFactory'>
<ref bean='ldapInitialDirContextFactory' />
</property>
<property name='namespaceService'>
<ref bean='namespaceService' />
</property>
<property name='memberAttribute'>
<value>member</value>
</property>
</bean>
The remaining config is similar to that for people. The main differences are that groups are loaded into the user store and all existing groups are cleared at the start of the import. The trigger and its registration are very similar.
<bean id='ldapGroupImport' class='org.alfresco.repo.importer.ExportSourceImporter'>
<property name='importerService'>
<ref bean='importerComponent' />
</property>
<property name='transactionService'>
<ref bean='transactionComponent'/>
</property>
<property name='authenticationComponent'>
<ref bean='authenticationComponent' />
</property>
<property name='exportSource'>
<ref bean='ldapGroupExportSource' />
</property>
<property name='storeRef'>
<value>${alfresco_user_store.store}</value>
</property>
<property name='path'>
<value>/${alfresco_user_store.system_container.childname}/${alfresco_user_store.authorities_container.childname}</value>
</property>
<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>
</bean>
The schedule for extraction and synchronisation is defined in
<bean id='ldapGroupTrigger' class='org.springframework.scheduling.quartz.SimpleTriggerBean'>
<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='startDelay'>
<value>60000</value>
</property>
<property name='repeatInterval'>
<value>3600000</value>
</property>
</bean>
It is wired up to the scheduler in
<bean id='schedulerFactory' class='org.springframework.scheduling.quartz.SchedulerFactoryBean'>
<property name='triggers'>
<list>
<ref bean='tempFileCleanerTrigger' />
<ref bean='ftsIndexerTrigger' />
<ref bean='indexRecoveryTrigger' />
<ref bean='indexBackupTrigger' />
<ref bean='ldapGroupTrigger' />
</list>
</property>
<property name='waitForJobsToCompleteOnShutdown'>
<value>true</value>
</property>
<property name='configLocation'>
<value>classpath:alfresco/domain/quartz.properties</value>
</property>
</bean>
For recent alfresco distributions, the above sections are still valid but there should be no need to modify the XML files. Instead there are two properties files
ldap-authentication.properties
ldap-synchronisation.properties
Here is a sample configuration file.
There are a number of things to note:
#
# See slapd.conf(5) for details on configuration options.
# This file should NOT be world readable.
#
include /usr/local/etc/openldap/schema/core.schema
include /usr/local/etc/openldap/schema/cosine.schema
include /usr/local/etc/openldap/schema/inetorgperson.schema
# Define global ACLs to disable default read access.
# Do not enable referrals until AFTER you have a working directory
# service AND an understanding of referrals.
#referral ldap://root.openldap.org
pidfile /usr/local/var/run/slapd.pid
argsfile /usr/local/var/run/slapd.args
# Load dynamic backend modules:
# modulepath /usr/local/libexec/openldap
# moduleload back_bdb.la
# moduleload back_ldap.la
# moduleload back_ldbm.la
# moduleload back_passwd.la
# moduleload back_shell.la
# Sample security restrictions
# Require integrity protection (prevent hijacking)
# Require 112-bit (3DES or better) encryption for updates
# Require 63-bit encryption for simple bind
# security ssf=1 update_ssf=112 simple_bind=64
# Sample access control policy:
# Root DSE: allow anyone to read it
# Subschema (sub)entry DSE: allow anyone to read it
# Other DSEs:
# Allow self write access
# Allow authenticated users read access
# Allow anonymous users to authenticate
# Directives needed to implement policy:
# access to dn.base='' by * read
# access to dn.base='cn=Subschema' by * read
# access to *
# by self write
# by users read
# by anonymous auth
#
# if no access controls are present, the default policy
# allows anyone and everyone to read anything but restricts
# updates to rootdn. (e.g., 'access to * by * read')
#
# rootdn can always read and write EVERYTHING!
#######################################################################
# BDB database definitions
#######################################################################
database bdb
suffix 'dc=company,dc=com'
rootdn 'cn=Manager,dc=company,dc=com'
# Cleartext passwords, especially for the rootdn, should
# be avoid. See slappasswd(8) and slapd.conf(5) for details.
# Use of strong authentication encouraged.
# This is secret ....
rootpw {SSHA}u9AUUYOSVX6idlXcwyYOAG6G84oHFpvG
# The database directory MUST exist prior to running slapd AND
# should only be accessible by the slapd and slap tools.
# Mode 700 recommended.
directory /usr/local/var/openldap-data
# Indices to maintain
index objectClass eq
# Clear text to allow hashing
password-hash {CLEARTEXT}
# SASL mappings for md5 digest authentication
# Extract the user id and use as the search key
authz-regexp
uid=([^,]*),cn=digest-md5,cn=auth
ldap:///dc=company,dc=com??one?(uid=$1)
authz-regexp
uid=([^,]*),cn=company.com,cn=digest-md5,cn=auth
ldap:///dc=company,dc=com??one?(uid=$1)
# Tweaks to increase the result set size and max query time
sizelimit 50000
timelimit 3600
Here is a very simple example data file that defines the ldap manager, admin user, an example user and an example group.
dn: dc=company,dc=com
changetype: add
objectclass: dcObject
objectclass: organization
o: Company Limited
dc: company
dn: cn=Manager,dc=company,dc=com
changetype: add
objectclass: organizationalRole
cn: Manager
dn: cn=admin,dc=company,dc=com
changetype: add
objectclass: inetOrgPerson
sn: Admin
cn: admin
userPassword: admin
telephoneNumber: 1234567890
uid: admin
givenName: Admin
mail: admin@company.org
o: Company Limited
dn: cn=Full Name,dc=company,dc=com
changetype: add
objectclass: inetOrgPerson
sn: Name
cn: Full Name
userPassword: inClearText
telephoneNumber: 1234567890
uid: fullname
givenName: Full
mail: full.name@company.com
o: Company Limited
dn: cn=Group One,dc=company,dc=com
changetype: add
objectclass: groupOfNames
cn: Group One
member: cn=Full Name,dc=company,dc=com
<bean id='ldapInitialDirContextFactory' class='org.alfresco.repo.security.authentication.ldap.LDAPInitialDirContextFactoryImpl'>
<property name='initialDirContextEnvironment'>
<map>
<entry key='java.naming.factory.initial'>
<value>com.sun.jndi.ldap.LdapCtxFactory</value>
</entry>
<entry key='java.naming.provider.url'>
<value>ldap://domaincontroller.your.company.org:389</value>
</entry>
<entry key='java.naming.security.authentication'>
<value>simple</value>
</entry>
<entry key='java.naming.security.principal'>
<value>cn=Al Fresco,ou=SomeOU,dc=your,dc=company,dc=org</value>
</entry>
<entry key='java.naming.security.credentials'>
<value>AlFrescoActiveDirectoryUserPassword</value>
</entry>
</map>
</property>
</bean>
<property name='personQuery'>
<value></value>
</property>
<bean id='authenticationComponentImpl' class='org.alfresco.repo.security.authentication.ldap.LDAPAuthenticationComponentImpl'>
<property name='LDAPInitialDirContextFactory'>
<ref bean='ldapInitialDirContextFactory' />
</property>
<property name='userNameFormat'>
<value>samaccountname=%s</value>
</property>
</bean>
<property name='attributeMapping'>
<map>
<entry key='cm:userName'>
<value>samaccountname</value>
</entry>
<entry key='cm:firstName'>
<value>givenName</value>
</entry>
<entry key='cm:lastName'>
<value>sn</value>
</entry>
<entry key='cm:email'>
<value>mail</value>
</entry>
<entry key='cm:organizationId'>
<value>company</value>
</entry>
</map>
</property>
<property name='userIdAttributeName'>
<value>samaccountname</value>
</property>
<property name='memberAttribute'>
<value>member</value>
</property>
Stores users in the Alfresco user store.
The main configuration option determines if user names are case sensitive.
This DAO should be used with all external authentication components.
There is some other way to make these changes to the information held in external authentication system. Alfresco never makes any changes to external authentication system. You would have to write your own DAO to do this.
By default all DAO operation will throw a runtime exception. It can be configured to allow the following actions which will then be a NO-OP or return the boolean values indicated.
Normally it is sufficient to allowDeleteUser which will allow people to be deleted via the Alfresco JSF client when using NTLM, JAAS/Kerberos, LDAP etc.
If you are using Alfresco Share then it is necessary to set allowGetEnabled to true to prevent site invites from breaking.
JAAS related:
LDAP related:
Most of these issues are fixed in Alfresco version 3.2. See Alfresco Authentication Subsystems.