Як працює автентифікація у МоінМоін
Історично МоінМоін підтримував лише автентифікацію користувач/пароль та сесії із використанням коржиків: ви входите у систему через форму входу, Моін передає коржика і з цього моменту цей коржик використовується для автентифікації - доки ви не вийдете так коржика не буде видалено (чи доки не вийде час роботи коржика).
У багатьох оточеннях це неоптимально, оскільки обмеження доступу мають базуватися на інших джерелах, як, скажімо, LDAP (Active Directory). Отже, для МоінМоін було розроблено модульну автентифікацію. Для конфігурування переліку автентифікаторів та встановлення порядку їх використання ви можете використовувати конфігураційний параметр auth.
Якщо використовується зовнішня база даних, вам би не хотілося створювати усіх користувачів Моін вручну. Для таких ситуацій було додано параметр user_autocreate. Якщо його встановлено рівним True, профілі для нових користувачів буде створено автоматично, коли новий користувач пройде процес автентифікації (і якщо автентифікатор підтримує автоматичне створення користувачів).
Зараз підтримуються такі автентифікатори:
Встановлення сервера
Автентифікація
Клас автентифікатора у Моін
Усі
засобами Моін через ім'я/пароль
MoinMoin.auth.MoinAuth
засобами PHP session
MoinMoin.auth.php_session.PHPSessionAuth
засобами Моін через зовнішні коржі
див. contrib/auth_externalcookie/ and HelpOnAuthentication/ExternalCookie
засобами OpenID
MoinMoin.auth.openidrp.OpenIDAuth
перевірка OpenID через http://botbouncer.com/
MoinMoin.auth.botbouncer.BotBouncer
Apache з CGI, modpy чи FastCgi
засобами модулів Apache: HTTP Basic, HTTP Digest, SSPI (aka NTLM) чи LDAP
MoinMoin.auth.http.HTTPAuth
засобами Моін через LDAP
MoinMoin.auth.ldap_login.LDAPAuth
засобами Моін через віддалений Моін Вікі
MoinMoin.auth.interwiki - досі експериментально
Apache+SSL з CGI, modpy чи FastCgi
засобами Apache через SSL-сертифікат клієнта
MoinMoin.auth.sslclientcert.SSLClientCertAuth
Twisted
HTTP Basic (але без запиту автентифікації у заголовках, отже це наразі можна використовувати лише для автоматизованих процесів, не для використання з переглядачами; використовує внутрішню базу даних Моіна, але саме по собі не не дає змогу реєструвати користувачів, отже працездатне лише з MoinAuth)
MoinMoin.auth.http.HTTPAuth
IIS
HTTP Basic, SSPI (aka NTLM), (?)
MoinMoin.auth.http.HTTPAuth, (?)
Інші псевдо-автентифікатори
Строго кажучи, це не автентифікатори, оскільки вони не автентифікують користувачів, але використовують автентифікаційну інформацію для інших потреб:
MoinMoin.auth.log.AuthLog
просто журналює запити на вхід/вихід, більше нічого
MoinMoin.auth.smb_mount.SMBMount
монтує певний ресурс share використовуючи ім'я/пароль, розмонтовує при виході
Модулі у складі Моін
MoinAuth (автентифікація за замовчуванням)
Це перелік автентифікаторів, який Моін використовує за замовчуванням (тобто, якщо вам потрібно саме це, вам не треба нічого конфігурувати).
Автентифікація HTTP
Щоб активувати автентифікацію HTTP, необхідно додати такі рядки до wikiconfig.py:
При автентифікації HTTP Basic з використанням засобів сервера (скажімо, Apache), веб-сервер виконує автентифікацію ще до того, як почне працювати Моін. Ви або вводите дійсні ім'я та пароль, або ж сервер заборонить вам доступ.
Автентифікатор HTTP Моіна лише перевірить, чи виконувалася автентифікація HTTP, та дозволить доступ, якщо виконувалася, та якщо користувач для вказаного імені існує.
На жаль, це все трохи складніше:
- Для серверів Twisted автентифікатор використовує ім'я та пароль з профілів користувачів Моіна, та дає змогу користувачам їх міняти.
Для NTLM та Negotiate він іґнорує все перед останньою зворотною похилою рискою ("\") (як правило це "Домен\користувач") і ми також використовуємо title() для "нормалізації" регістру "користувач" у "Користувач".
Параметр конфігурації user_autocreate повинно бути встановлено у True, щоб автентифікатор міг створювати профілі нових користувачів, якщо автентифікований користувач ще не має профіля.
Дивись деякі специфічні для win32 інструкції також у ДовідкаВстановлення/ApacheOnWin32ДоменнаАвтентифікація.
Автентифікація клієнтських сертифікатів SSL
Щоб активувати автентифікацію через клієнтські сертифікати SSL, вам необхідно додати до wikiconfig.py такі рядки:
Автентифікацію клієнтських сертифікатів SSL необхідно використовувати з веб-сервером на зразок Apache, який опрацьовує взаємодію з SSL та просто встановлює кілька змінних оточення для Моіна.
Автентифікатор SSLClientCertAuth має кілька параметрів, які передаються конструктору (приклади нижче):
Параметр |
Стандартно |
Опис |
authorities |
Немає |
перелік центрів сертифікатів, сертифікати яких приймати, чи None, щоб приймати від усіх |
email_key |
True |
вказує, чи використовувати для знаходження користувача Моін електронну пошту з сертифікату |
name_key |
True |
вказує, чи використовувати для знаходження користувача Моін ім'я з сертифікату |
use_email |
False |
якщо True, електронну пошту користувача змінювати не можна, і потрібно використовувати пошту з сертифікату |
use_name |
False |
якщо True, ім'я користувача змінювати не можна, і потрібно використовувати ім'я з сертифікату |
Наприклад, щоб приймати лише лише перевірені сервером сертифікати, і лише ті, які підписані певним центром, використовуйте:
чи щось подібне.
Зазвичай вам треба встановлювати user_autocreate = True у конфігурації, якщо ви використовуєте цей автентифікатор. Тоді Моін буде автоматично створювати профілі для автентифікованих користувачів, якщо вони ще не мають профіля.
Сесії PHP
Щоб активувати інтеграцію Single-Sign-On із засобами PHP,використовуйте цей модуль. Він читає файли сесій PHP і таким чином безпосередньо інтегрує наявні системи автентифікації PHP.
Щоб використовувати цей модуль, додайте до конфігурації такі рядки:
PHPSessionAuth має такі параметри:
1 PHPSessionAuth(apps=['egw'], s_path="/tmp", s_prefix="sess_")
apps це перелік дозволених програм
s_path це шлях до файлів сесій PHP
s_prefix це префікс файлів сесій PHP
Наразі єдина програма, що підтримується, -- eGroupware 1.2. Але повинно бути досить просто додати кілька рядків коду для видобування потрібної інформації з файлів сесій PHP, і якщо ви це зробите, будь ласка, створіть запит на додавання функціональності і додайте латку.
OpenID (з BotBouncer)
Модуль автентифікації OpenID дає змогу користувачам використовувати їхній OpenID для входу у новий чи наявний обліковий запис Моіна. Щоб дозволити користувачам входити з OpenID, додайте модуль до переліку автентифікаторів, чи, щоб використовувати OpenID з перевіркою на http://botbouncer.com/, використовуйте:
Автентифікація з OpenID портребує анонімні сесії, встановіть anonymous_session_lifetime рівним чомусь більшому нуля. Більше інформації щодо цього параметру шукайте у ДовідкаВстановлення. Для автентифікації з OpenID буде достатньо дуже невеликого часу.
Advanced OpenID RP configuration
The OpenID RP code can also be configured for two use cases:
- You can force a specific provider to be used, there are two ways to achieve this:
Simply configure the OpenIDAuth authenticator like this:
auth = OpenIDAuth(forced_service='http://myopenid.com/')
Create an OpenIDServiceEndpoint object and use that for the forced_service parameter:
fs = OpenIDServiceEndpoint() fs.type_uris = OPENID_2_0_TYPE fs.server_url = 'http://localhost:8000/openidserver' fs.claimed_id = 'http://specs.openid.net/auth/2.0/identifier_select' auth = OpenIDAuth(forced_service=fs)
You can specify functions to be called in various steps of the OpenID authentication process to, for example, implement Attribute Exchange. For now, this is not documented here, you'll have to look at the file MoinMoin/auth/openidrp.py.
LDAP based user authentication
The LDAP authenticator of MoinMoin enables single-sign-on (SSO) - assuming you already have a LDAP directory with your users, passwords, email adresses. On Linux this could be some OpenLDAP server, on a Windows server (usually the domain controller) this is called "Active Directory" (short: AD).
It works like this:
- User enters his name and password via moin's login action and clicks on the login button.
- On login, ldap_login.LDAPAuth checks username/password against LDAP.
If username/password is ok for LDAP, it creates or updates a user profile with values from ldap (name, alias, email) and creates a user object in the MoinMoin process, then it hands over to the next authenticator...
- If username/password is not ok for LDAP, it vetoes and aborts the login (no other authenticators checked).
- If the login was successful, moin establishes a session for that user.
LDAP auth installation / configuration
You need to install python-ldap module (and everything it depends on, see its documentation).
You need an LDAP or AD server.
See wiki/config/more_samples/ldap_wikiconfig_snippet.py in your moin dist archive for a snippet you can use in your wiki config.
Please also read the README file in that directory.
LDAP auth Problems?
MoinMoin support does not know your LDAP server setup, so please follow these steps before asking for help:
Configure DEBUG logging for MoinMoin.auth.ldap_login and look into the log output.
- Verify your settings and your user/password by e.g. using ldapsearch to query your LDAP server.
As long as you don't manage talking to your LDAP server with such a tool, you don't need to try with MoinMoin.
- Ask the administrator of your LDAP/AD server for help / for correct settings.
Maybe look into MoinMoin/auth/ldap_login.py, if you can debug or fix your problem there.
Only ask MoinMoin support if you successfully used ldapsearch (or some similar tool) and you double checked your wiki config and it does still not work with moin.
XMLRPC auth
1 import xmlrpclib
2
3 name = "TestUser"
4 password = "secret"
5 wikiurl = "http://localhost:8080/"
6
7 homewiki = xmlrpclib.ServerProxy(wikiurl + "?action=xmlrpc2", allow_none=True)
8 auth_token = homewiki.getAuthToken(name, password)
9
10 mc = xmlrpclib.MultiCall(homewiki)
11 mc.applyAuthToken(auth_token)
12 # you can add more xmlrpc method calls to the multicall here,
13 # they will run authenticated as user <name>.
14 result = mc()
Combining multiple authenticators
For combining e.g. SSL client certificate and username/password authentication, your wikiconfig.py might contain:
In that case, any client certificates that the user provides will be used to log him on, but if they do not provide one they still have the option of logging on with their username/password.
Writing your own authenticator
See the commented config file fragment contrib/auth_externalcookie/ and MoinMoin/auth/*.py in your moin distribution archive for examples of how to do authentication. Also, the docstring in MoinMoin/auth/__init__.py contains an explanation of what can be done and how it is achieved.
Authenticators can
- use the regular login form as their user interface for entering name and password
- use the regular logout action for logging out
- prohibit logging out (like SSL client certificate authentication that checks for every request)
- search existing user profiles for a "matching" user (the match needs not be the name, it can also be the email address or something you put into aliasname)
- create a user object and let it remember what attributes were determined by authenticator (and thus should not be offered on user preferences)
- update values in user's profile from externally provided data
- autocreate user profiles