In the last few months, I worked a lot on connecting different services to OpenLDAP. My general impression is that, in many cases, there could be a more detailed documentation about it. So here is a little collection – no long articles, just the configuration part. This is part 2: How to integrate MediaWiki with OpenLDAP?
You need the extension LDAP_Authentication to authenticate users against OpenLDAP. The usual place to configure MediaWiki, is the file LocalSettings.php, so that’s where you insert the LDAP stuff, too. I found it very well documented. Here is what I wanted to do:
- My wiki users are organized in two different subtrees in the DIT (here I called them „staff“ and „volunteers“).
- I want to synchronize LDAP groups to MediaWiki security groups. The MediaWiki security groups the users from both LDAP groups are in partly overlap („group1“).
- The wiki already exists. The user names are full names including a space. I will use the displayName from LDAP.
- Again, I use groupOfNames and the memberOf overlay. There is this setting that confused me first: $wgLDAPGroupsUseMemberOf. If you turn it on, the extension will query LDAP for all groups the given user account is a member of, even if they are outside the defined $wgLDAPGroupBaseDNs. Each of these groups is then compared to $wgLDAPRequiredGroups. I couldn’t get this to work, but without the setting it does.
require_once "$IP/extensions/LdapAuthentication/LdapAuthentication.php"; // Extra debug log $wgLDAPDebug = 9; $wgDebugLogGroups['ldap'] = '/tmp/debug.log'; $wgAuth = new LdapAuthenticationPlugin(); // My two groups of users according to LDAP. // They will show in a drop down menu on Mediawiki's login page. $wgLDAPDomainNames = array( 'staff', 'volunteers' ); $wgLDAPServerNames = array( 'staff' => 'localhost', 'volunteers' => 'localhost' ); $wgLDAPEncryptionType = array( 'staff' => 'tls', 'volunteers' => 'tls' ); $wgLDAPPort = array( 'staff' => 389, 'volunteers' => 389 ); // bind account $wgLDAPProxyAgent = array( 'staff' => 'cn=binduser,dc=example,dc=org', 'volunteers' => 'cn=binduser,dc=example,dc=org' ); $wgLDAPProxyAgentPassword = array( 'staff' => 'secret', 'volunteers' => 'secret' ); // Do not use MediaWiki's database $wgLDAPUseLocal = false; // get the displayName attribute from LDAP $wgLDAPSearchAttributes = array( 'staff' => 'displayName', 'volunteers' => 'displayName' ); // username mapping -> use displayName from LDAP as login name $wgHooks['SetUsernameAttributeFromLDAP'][] = 'SetUsernameAttribute'; function SetUsernameAttribute(&$LDAPUsername, $info) { if ( isset($info[0]['displayName']) ) { $LDAPUsername = $info[0]['displayName'][0]; } return true; } // where to look in the LDAP tree $wgLDAPBaseDNs = array( 'staff' => 'dc=example,dc=org', 'volunteers' => 'dc=example,dc=org' ); $wgLDAPGroupBaseDNs = array( 'staff' => 'ou=wiki,ou=staff,dc=example,dc=org', 'volunteers' => 'ou=wiki,ou=volunteers,dc=example,dc=org' ); $wgLDAPUserBaseDNs = array( 'staff' => 'ou=users,ou=staff,dc=example,dc=org', 'volunteers' => 'ou=users,ou=volunteers,dc=example,dc=org' ); // mapping attributes between MW and LDAP $wgLDAPPreferences = array( 'staff' => array( 'email' => 'mail', 'realname' => 'displayName' ), 'volunteers' => array( 'email' => 'mail', 'realname' => 'displayName' ) ); $wgLDAPGroupUseRetrievedUsername = array( 'staff' => true, 'volunteers' => true ); // Automatically create user accounts if LDAP accounts exist $wgLDAPDisableAutoCreate = array( 'staff' => false, 'volunteers' => false ); # Group based restriction $wgLDAPLowerCaseUsername = array( 'staff' => false, 'volunteers' => false ); $wgLDAPGroupUseFullDN = array( 'staff' => true, 'volunteers' => true ); $wgLDAPGroupObjectclass = array( 'staff' => 'groupOfNames', 'volunteers' => 'groupOfNames' ); $wgLDAPGroupAttribute = array( 'staff' => 'member', 'volunteers' => 'member' ); $wgLDAPGroupNameAttribute = array( 'staff' => 'cn', 'volunteers' => 'cn' ); // synching LDAP groups with MW security groups $wgLDAPUseLDAPGroups = array( 'staff' => true, 'volunteers' => true ); // Create the MediaWiki groups sysop, bureaucrat and bot in LDAP and use them. // If you have other MW security groups list them here. $wgLDAPLocallyManagedGroups = array( 'staff' => array( 'group1', 'group2' ), 'volunteers' => array( 'group1', 'group3' ) ); // For group based login restrictions: // Array of the groups the user is required to be a member of: $wgLDAPRequiredGroups = array( 'staff' => array( 'cn=sysop,ou=wiki,ou=staff,dc=example,dc=org'', 'cn=bureaucrat,ou=wiki,ou=staff,dc=example,dc=org', 'cn=bot,ou=wiki,ou=staff,dc=example,dc=org', 'cn=group1,ou=wiki,ou=staff,dc=example,dc=org', 'cn=group2,ou=wiki,ou=staff,dc=example,dc=org', ), 'volunteers' => array( 'cn=group1,ou=wiki,ou=volunteers,dc=example,dc=org' 'cn=group3,ou=wiki,ou=volunteers,dc=example,dc=org' ), );