~funderscoreblog cgit wikiget in touch

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

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

У багатьох оточеннях це неоптимально, оскільки обмеження доступу мають базуватися на інших джерелах, як, скажімо, LDAP (Active Directory). Отже, для МоінМоін було розроблено модульну автентифікацію. Для конфігурування переліку автентифікаторів та встановлення порядку їх використання ви можете використовувати конфігураційний параметр auth.

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

Зараз підтримуються такі автентифікатори:

Інші псевдо-автентифікатори

Строго кажучи, це не автентифікатори, оскільки вони не автентифікують користувачів, але використовують автентифікаційну інформацію для інших потреб:

Модулі у складі Моін

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, та дозволить доступ, якщо виконувалася, та якщо користувач для вказаного імені існує.

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

Автентифікація клієнтських сертифікатів 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'])]

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

Сесії 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_")

Наразі єдина програма, що підтримується, -- 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:

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:

/!\ 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