• Immutable Page
  • Info
  • Attachments

Як працює автентифікація у МоінМоін

Історично МоінМоін підтримував лише автентифікацію користувач/пароль та сесії із використанням коржиків: ви входите у систему через форму входу, Моін передає коржика і з цього моменту цей коржик використовується для автентифікації - доки ви не вийдете так коржика не буде видалено (чи доки не вийде час роботи коржика).

У багатьох оточеннях це неоптимально, оскільки обмеження доступу мають базуватися на інших джерелах, як, скажімо, 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 (автентифікація за замовчуванням)

Це перелік автентифікаторів, який Моін використовує за замовчуванням (тобто, якщо вам потрібно саме це, вам не треба нічого конфігурувати).

   1     from MoinMoin.auth import MoinAuth
   2     auth = [MoinAuth()]

Автентифікація HTTP

Щоб активувати автентифікацію HTTP, необхідно додати такі рядки до wikiconfig.py:

   1     from MoinMoin.auth.http import HTTPAuth
   2     auth = [HTTPAuth()]

При автентифікації HTTP Basic з використанням засобів сервера (скажімо, Apache), веб-сервер виконує автентифікацію ще до того, як почне працювати Моін. Ви або вводите дійсні ім'я та пароль, або ж сервер заборонить вам доступ.

Автентифікатор HTTP Моіна лише перевірить, чи виконувалася автентифікація HTTP, та дозволить доступ, якщо виконувалася, та якщо користувач для вказаного імені існує.

На жаль, це все трохи складніше:

  • Для серверів Twisted автентифікатор використовує ім'я та пароль з профілів користувачів Моіна, та дає змогу користувачам їх міняти.
  • Для NTLM та Negotiate він іґнорує все перед останньою зворотною похилою рискою ("\") (як правило це "Домен\користувач") і ми також використовуємо title() для "нормалізації" регістру "користувач" у "Користувач".

  • Параметр конфігурації user_autocreate повинно бути встановлено у True, щоб автентифікатор міг створювати профілі нових користувачів, якщо автентифікований користувач ще не має профіля.

  • Дивись деякі специфічні для win32 інструкції також у ДовідкаВстановлення/ApacheOnWin32ДоменнаАвтентифікація.

Автентифікація клієнтських сертифікатів SSL

Щоб активувати автентифікацію через клієнтські сертифікати SSL, вам необхідно додати до wikiconfig.py такі рядки:

   1     from MoinMoin.auth.sslclientcert import SSLClientCertAuth
   2     auth = [SSLClientCertAuth()]

Автентифікацію клієнтських сертифікатів SSL необхідно використовувати з веб-сервером на зразок Apache, який опрацьовує взаємодію з SSL та просто встановлює кілька змінних оточення для Моіна.

Автентифікатор SSLClientCertAuth має кілька параметрів, які передаються конструктору (приклади нижче):

Параметр

Стандартно

Опис

authorities

Немає

перелік центрів сертифікатів, сертифікати яких приймати, чи None, щоб приймати від усіх

email_key

True

вказує, чи використовувати для знаходження користувача Моін електронну пошту з сертифікату

name_key

True

вказує, чи використовувати для знаходження користувача Моін ім'я з сертифікату

use_email

False

якщо True, електронну пошту користувача змінювати не можна, і потрібно використовувати пошту з сертифікату

use_name

False

якщо True, ім'я користувача змінювати не можна, і потрібно використовувати ім'я з сертифікату

Наприклад, щоб приймати лише лише перевірені сервером сертифікати, і лише ті, які підписані певним центром, використовуйте:

   1     from MoinMoin.auth.sslclientcert import SSLClientCertAuth
   2     auth = [SSLClientCertAuth(authorities=['my.authority.tld'])]

чи щось подібне.

  • (!) Зазвичай вам треба встановлювати user_autocreate = True у конфігурації, якщо ви використовуєте цей автентифікатор. Тоді Моін буде автоматично створювати профілі для автентифікованих користувачів, якщо вони ще не мають профіля.

Сесії PHP

Щоб активувати інтеграцію Single-Sign-On із засобами PHP,використовуйте цей модуль. Він читає файли сесій PHP і таким чином безпосередньо інтегрує наявні системи автентифікації PHP.

Щоб використовувати цей модуль, додайте до конфігурації такі рядки:

   1     from MoinMoin.auth.php_session import PHPSessionAuth
   2     auth = [PHPSessionAuth()]

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/, використовуйте:

   1     from MoinMoin.auth.openidrp import OpenIDAuth
   2     from MoinMoin.auth.botbouncer import BotBouncer
   3     auth = [OpenIDAuth(), BotBouncer("your-botbouncer-API-key")]

Автентифікація з OpenID портребує анонімні сесії, встановіть anonymous_session_lifetime рівним чомусь більшому нуля. Більше інформації щодо цього параметру шукайте у ДовідкаВстановлення. Для автентифікації з OpenID буде достатньо дуже невеликого часу.

Advanced OpenID RP configuration

The OpenID RP code can also be configured for two use cases:

  1. 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)
    In the latter case, no discovery needs to be done.
  2. 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:

   1     from MoinMoin.auth import MoinAuth
   2     from MoinMoin.auth.sslclientcert import SSLClientCertAuth
   3     auth = [SSLClientCertAuth(), MoinAuth()]

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