Як працює автентифікація у МоінМоін
Історично МоінМоін підтримував лише автентифікацію користувач/пароль та сесії із використанням коржиків: ви входите у систему через форму входу, Моін передає коржика і з цього моменту цей коржик використовується для автентифікації - доки ви не вийдете так коржика не буде видалено (чи доки не вийде час роботи коржика).
У багатьох оточеннях це неоптимально, оскільки обмеження доступу мають базуватися на інших джерелах, як, скажімо, LDAP (Active Directory). Отже, для МоінМоін було розроблено модульну автентифікацію. Для конфігурування переліку автентифікаторів та встановлення порядку їх використання ви можете використовувати конфігураційний параметр `auth`.
Якщо використовується зовнішня база даних, вам би не хотілося створювати усіх користувачів Моін вручну. Для таких ситуацій було додано параметр `user_autocreate`. Якщо його встановлено рівним `True`, профілі для нових користувачів буде створено автоматично, коли новий користувач пройде процес автентифікації (і якщо автентифікатор підтримує автоматичне створення користувачів).
Зараз підтримуються такі автентифікатори:
Встановлення сервера
Автентифікація
Клас автентифікатора у Моін
Усі
засобами Моін через ім'я/пароль
засобами 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 чи Fast``Cgi
засобами модулів 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 чи Fast``Cgi
засобами Apache через SSL-сертифікат клієнта
`MoinMoin.auth.sslclientcert.SSLClientCertAuth`
Twisted
HTTP Basic (але без запиту автентифікації у заголовках, отже це наразі можна використовувати лише для автоматизованих процесів, не для використання з переглядачами; використовує внутрішню базу даних Моіна, але саме по собі не не дає змогу реєструвати користувачів, отже працездатне лише з Moin``Auth)
`MoinMoin.auth.http.HTTPAuth`
IIS
HTTP Basic, SSPI (aka NTLM), (?)
`MoinMoin.auth.http.HTTPAuth`, (?)
Інші псевдо-автентифікатори
Строго кажучи, це не автентифікатори, оскільки вони не автентифікують користувачів, але використовують автентифікаційну інформацію для інших потреб:
Модулі у складі Моін
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