Авторизация#

Регистрация пользователя#

В установке по умолчанию Weblate использует python-social-auth, форму на сайте для обработки регистраций новых пользователей. После подтверждения своей электронной почты новый пользователь может вносить свой вклад в переводы или пройти авторизацию, воспользовавшись одним из сторонних сервисов.

Также вы можете отключить регистрацию новых пользователей с помощью установки параметра REGISTRATION_OPEN.

Попытки авторизации учитываются при применении ограничений на частоту запросов.

Способы авторизации#

Для авторизации используется встроенное решение Django, включающее в себя для этого авторизацию от различных социальных сетей. Использование этого решения означает, что вы сможете импортировать себе базу данных пользователей других проектов, написанных на Django (смотрите раздел Переход с Pootle).

Кроме того, авторизация в Django может быть настроена и с использованием других способов.

См.также

В разделе Параметры авторизации описано, как настроить авторизацию в официальном образе Docker.

Социальная авторизация#

Благодаря пакету Python Social Auth, Weblate поддерживает авторизацию с использованием множества сторонних сервисов, таких как GitLab, Ubuntu, Fedora и другие.

Для получения общих инструкций по настройке ознакомьтесь с их документацией в разделе среды Django.

Примечание

По умолчанию Weblate полагается на сторонние сервисы авторизации для предоставления подтверждённого адреса электронной почты. Если некоторые сервисы, которые вы хотите использовать, это не поддерживают, включите принудительную проверку адреса электронной почты на стороне Weblate, настроив их параметр FORCE_EMAIL_VALIDATION. Например:

SOCIAL_AUTH_OPENSUSE_FORCE_EMAIL_VALIDATION = True

См.также

Конвейер

Включить конкретный способ авторизации довольно просто: нужно всего-навсего добавить его имя в параметр AUTHENTICATION_BACKENDS, а также, по необходимости, задать необходимые ему ключи доступа. Обратите внимание, что некоторые способы по умолчанию не предоставляют адрес электронной почты пользователя, в этом случае вы должны запросить его явно, иначе Weblate не сможет правильно указать авторство выполненных пользователями переводов.

Подсказка

Большинство бэкендов авторизации требуют HTTPS. Как только HTTPS включён на вашем веб-сервере, пожалуйста, настройте Weblate, чтобы он сообщал об этом должным образом, используя ENABLE_HTTPS, или WEBLATE_ENABLE_HTTPS в контейнере Docker.

Авторизация OpenID#

Для сервисов, основанных на OpenID, обычно это просто вопрос её включения. Следующий блок кода включает авторизацию OpenID для OpenSUSE, Fedora и Ubuntu:

# Authentication configuration
AUTHENTICATION_BACKENDS = (
    "social_core.backends.email.EmailAuth",
    "social_core.backends.suse.OpenSUSEOpenId",
    "social_core.backends.ubuntu.UbuntuOpenId",
    "social_core.backends.fedora.FedoraOpenId",
    "weblate.accounts.auth.WeblateUserBackend",
)

См.также

OpenID

Авторизация GitHub#

Вам нужно будет зарегистрировать приложение OAuth в GitHub, а затем передать Weblate все его данные:

# Authentication configuration
AUTHENTICATION_BACKENDS = (
    "social_core.backends.github.GithubOAuth2",
    "social_core.backends.email.EmailAuth",
    "weblate.accounts.auth.WeblateUserBackend",
)

# Social auth backends setup
SOCIAL_AUTH_GITHUB_KEY = "GitHub Client ID"
SOCIAL_AUTH_GITHUB_SECRET = "GitHub Client Secret"
SOCIAL_AUTH_GITHUB_SCOPE = ["user:email"]

На GitHub должен быть настроен URL обратного вызова https://WEBLATE SERVER/accounts/complete/github/.

Для GitHub for Organizations и GitHub for Teams существуют аналогичные бэкенды авторизации. Их настройки называются SOCIAL_AUTH_GITHUB_ORG_* и SOCIAL_AUTH_GITHUB_TEAM_*, и требуют дополнительной настройки области видимости - SOCIAL_AUTH_GITHUB_ORG_NAME или SOCIAL_AUTH_GITHUB_TEAM_ID. Их URL обратного вызова: https://example.com/accounts/complete/github-org/ и https://example.com/accounts/complete/github-teams/.

Примечание

Weblate предоставляет URL-адрес обратного вызова, вызываемый во время авторизации, в который включён настроенный домен. В случае, если вы получаете ошибки о несовпадении URL, возможно, вы захотите это исправить, смотрите раздел Установка правильного домена сайта.

См.также

GitHub

Авторизация GitHub EE#

Вам необходимо зарегистрировать приложение OAuth на GitHub EE, а затем сообщить Weblate все его данные:

# Authentication configuration
AUTHENTICATION_BACKENDS = (
    "social_core.backends.github_enterprise.GithubEnterpriseOAuth2",
    "social_core.backends.email.EmailAuth",
    "weblate.accounts.auth.WeblateUserBackend",
)

# Social auth backends setup
SOCIAL_AUTH_GITHUB_ENTERPRISE_KEY = "GitHub OAuth App Client ID"
SOCIAL_AUTH_GITHUB_ENTERPRISE_SECRET = "GitHub OAuth App Client Secret"
SOCIAL_AUTH_GITHUB_ENTERPRISE_URL = "https://git.example.com/"
SOCIAL_AUTH_GITHUB_ENTERPRISE_API_URL = "https://git.example.com/api/v3/"
SOCIAL_AUTH_GITHUB_ENTERPRISE_SCOPE = ["user:email"]

Приложение GitHub OAuth App должно быть настроено так, чтобы URL обратного вызова имел вид https://WEBLATE SERVER/accounts/complete/github-enterprise/.

Вместо GitHub OAuth App можно также использовать GitHub App. С помощью GitHub App права доступа могут быть предоставлены на уровне репозиториев, организации и/или пользователя. Если вы решили использовать GitHub App, то необходимо включить разрешение Доступ: Только чтение для пользователей - <Адреса электронной почты> и организаций - <Участники>.

Примечание

Weblate предоставляет URL-адрес обратного вызова, вызываемый во время авторизации, в который включён настроенный домен. В случае, если вы получаете ошибки о несовпадении URL, возможно, вы захотите это исправить, смотрите раздел Установка правильного домена сайта.

См.также

GitHub Enterprise

Авторизация Bitbucket#

Вам нужно будет зарегистрировать приложение в Bitbucket, а затем сообщить Weblate все его данные:

# Authentication configuration
AUTHENTICATION_BACKENDS = (
    "social_core.backends.bitbucket.BitbucketOAuth2",
    "social_core.backends.email.EmailAuth",
    "weblate.accounts.auth.WeblateUserBackend",
)

# Social auth backends setup
SOCIAL_AUTH_BITBUCKET_OAUTH2_KEY = "Bitbucket Client ID"
SOCIAL_AUTH_BITBUCKET_OAUTH2_SECRET = "Bitbucket Client Secret"
SOCIAL_AUTH_BITBUCKET_OAUTH2_VERIFIED_EMAILS_ONLY = True

Примечание

Weblate предоставляет URL-адрес обратного вызова, вызываемый во время авторизации, в который включён настроенный домен. В случае, если вы получаете ошибки о несовпадении URL, возможно, вы захотите это исправить, смотрите раздел Установка правильного домена сайта.

См.также

Bitbucket

Google OAuth 2#

Для использования Google OAuth 2 необходимо зарегистрировать приложение на <https://console.developers.google.com/> и включить Google+ API.

URL-адрес перенаправления — https://СЕРВЕР WEBLATE/accounts/complete/google-oauth2/

# Authentication configuration
AUTHENTICATION_BACKENDS = (
    "social_core.backends.google.GoogleOAuth2",
    "social_core.backends.email.EmailAuth",
    "weblate.accounts.auth.WeblateUserBackend",
)

# Social auth backends setup
SOCIAL_AUTH_GOOGLE_OAUTH2_KEY = "Client ID"
SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET = "Client secret"

Примечание

Weblate предоставляет URL-адрес обратного вызова, вызываемый во время авторизации, в который включён настроенный домен. В случае, если вы получаете ошибки о несовпадении URL, возможно, вы захотите это исправить, смотрите раздел Установка правильного домена сайта.

См.также

Google

Facebook OAuth 2#

Как обычно с сервисами OAuth 2, вам необходимо зарегистрировать ваше приложение в Facebook. После этого вы сможете настроить Weblate на его использование:

URL-адрес перенаправления — https://СЕРВЕР WEBLATE/accounts/complete/facebook/

# Authentication configuration
AUTHENTICATION_BACKENDS = (
    "social_core.backends.facebook.FacebookOAuth2",
    "social_core.backends.email.EmailAuth",
    "weblate.accounts.auth.WeblateUserBackend",
)

# Social auth backends setup
SOCIAL_AUTH_FACEBOOK_KEY = "key"
SOCIAL_AUTH_FACEBOOK_SECRET = "secret"
SOCIAL_AUTH_FACEBOOK_SCOPE = ["email", "public_profile"]

Примечание

Weblate предоставляет URL-адрес обратного вызова, вызываемый во время авторизации, в который включён настроенный домен. В случае, если вы получаете ошибки о несовпадении URL, возможно, вы захотите это исправить, смотрите раздел Установка правильного домена сайта.

См.также

Facebook

GitLab OAuth 2#

Для использования GitLab OAuth 2 необходимо зарегистрировать приложение на <https://gitlab.com/profile/applications>.

URL-адрес перенаправления — https://СЕРВЕР WEBLATE/accounts/complete/gitlab/ и убедитесь, что вы отметили область видимости read_user.

# Authentication configuration
AUTHENTICATION_BACKENDS = (
    "social_core.backends.gitlab.GitLabOAuth2",
    "social_core.backends.email.EmailAuth",
    "weblate.accounts.auth.WeblateUserBackend",
)

# Social auth backends setup
SOCIAL_AUTH_GITLAB_KEY = "Application ID"
SOCIAL_AUTH_GITLAB_SECRET = "Secret"
SOCIAL_AUTH_GITLAB_SCOPE = ["read_user"]

# If you are using your own GitLab
# SOCIAL_AUTH_GITLAB_API_URL = 'https://gitlab.example.com/'

Примечание

Weblate предоставляет URL-адрес обратного вызова, вызываемый во время авторизации, в который включён настроенный домен. В случае, если вы получаете ошибки о несовпадении URL, возможно, вы захотите это исправить, смотрите раздел Установка правильного домена сайта.

См.также

GitLab

Microsoft Azure Active Directory#

Weblate можно настроить на использование общих или конкретных арендаторов для авторизации.

URL-адрес перенаправления — https://СЕРВЕР WEBLATE/accounts/complete/azuread-oauth2/ для общей и https://СЕРВЕР WEBLATE/accounts/complete/azuread-tenant-oauth2/ для конкретной для арендатора авторизации.

Вам потребуется следующее:

  • Идентификатор (ID) приложения (клиента) можно получить на странице приложения. Идентификатор объекта в Weblate не используется.

  • Идентификатор (ID) каталога (клиента) необходим для проверки подлинности на уровне клиента, что обычно требуется.

  • Значение секрета отображается после создания ключа для приложения. Идентификатор (ID) секрета не используется в Weblate.

# Azure AD common

# Authentication configuration
AUTHENTICATION_BACKENDS = (
    "social_core.backends.azuread.AzureADOAuth2",
    "social_core.backends.email.EmailAuth",
    "weblate.accounts.auth.WeblateUserBackend",
)

# OAuth2 keys
SOCIAL_AUTH_AZUREAD_OAUTH2_KEY = ""
SOCIAL_AUTH_AZUREAD_OAUTH2_SECRET = ""
# Azure AD Tenant

# Authentication configuration
AUTHENTICATION_BACKENDS = (
    "social_core.backends.azuread_tenant.AzureADTenantOAuth2",
    "social_core.backends.email.EmailAuth",
    "weblate.accounts.auth.WeblateUserBackend",
)

# Application (client) ID
SOCIAL_AUTH_AZUREAD_TENANT_OAUTH2_KEY = ""
# Secret value
SOCIAL_AUTH_AZUREAD_TENANT_OAUTH2_SECRET = ""
# Directory (tenant) ID
SOCIAL_AUTH_AZUREAD_TENANT_OAUTH2_TENANT_ID = ""

Примечание

Weblate предоставляет URL-адрес обратного вызова, вызываемый во время авторизации, в который включён настроенный домен. В случае, если вы получаете ошибки о несовпадении URL, возможно, вы захотите это исправить, смотрите раздел Установка правильного домена сайта.

Slack#

Для использования Slack OAuth 2 необходимо зарегистрировать приложение на <https://api.slack.com/apps>.

URL-адрес перенаправления — https://СЕРВЕР WEBLATE/accounts/complete/slack/.

# Authentication configuration
AUTHENTICATION_BACKENDS = (
    "social_core.backends.slack.SlackOAuth2",
    "social_core.backends.email.EmailAuth",
    "weblate.accounts.auth.WeblateUserBackend",
)

# Social auth backends setup
SOCIAL_AUTH_SLACK_KEY = ""
SOCIAL_AUTH_SLACK_SECRET = ""

Примечание

Weblate предоставляет URL-адрес обратного вызова, вызываемый во время авторизации, в который включён настроенный домен. В случае, если вы получаете ошибки о несовпадении URL, возможно, вы захотите это исправить, смотрите раздел Установка правильного домена сайта.

См.также

Slack

Переопределение имён и значков методов авторизации#

Вы можете переопределить отображаемое имя метода авторизации и иконку, используя параметры SOCIAL_AUTH_<NAME>_IMAGE и SOCIAL_AUTH_<NAME>_TITLE. Например, переопределение именования для Auth0 будет выглядеть следующим образом:

SOCIAL_AUTH_AUTH0_IMAGE = "custom.svg"
SOCIAL_AUTH_AUTH0_TITLE = "Custom auth"

Отключение авторизации по паролю#

Авторизацию по электронной почте и паролю можно отключить, удалив social_core.backends.email.EmailAuth из параметра AUTHENTICATION_BACKENDS. Никогда не удаляйте оттуда weblate.accounts.auth.WeblateUserBackend, он необходим для работы основных функций Weblate.

Отключение авторизации по электронной почте приведёт к отключению всех функций, связанных с электронной почтой, включая приглашение пользователя или функцию сброса пароля.

Совет

Вы всё ещё можете использовать авторизацию по паролю для интерфейса администратора и для пользователей, которых вы создаёте там вручную. Просто зайдите на /admin/login/.

Например, авторизация с использованием только провайдера openSUSE Open ID может быть достигнута при помощи следующего кода:

# Authentication configuration
AUTHENTICATION_BACKENDS = (
    "social_core.backends.suse.OpenSUSEOpenId",
    "weblate.accounts.auth.WeblateUserBackend",
)

Авторизация по паролю#

По умолчанию settings.py поставляется с разумным набором проверок в параметре AUTH_PASSWORD_VALIDATORS:

  • Пароли не могут быть слишком похожи на другие ваши личные данные.

  • Пароли должны содержать минимум 10 символов.

  • Пароли не могут быть широко распространёнными паролями.

  • Пароли не могут быть полностью цифровыми.

  • Пароли не могут состоять из одного символа или только из пробелов.

  • Пароли не могут совпадать с предыдущими вашими паролями.

Вы можете настроить этот параметр в соответствии с вашей политикой паролей.

Дополнительно можно установить пакет django-zxcvbn-password, который вычисляет вполне реалистичные оценки сложности пароля и позволяет отклонять пароли с оценкой ниже определённого порога.

См.также

WEBLATE_MIN_PASSWORD_SCORE

Авторизация через SAML#

Добавлено в версии 4.1.1.

Пожалуйста, следуйте инструкциям по настройке Python Social Auth. Значимые отличия:

  • Weblate поддерживает один IDP, который в SOCIAL_AUTH_SAML_ENABLED_IDPS должен называться weblate.

  • URL-адрес XML с метаданными SAML — /accounts/metadata/saml/.

  • Следующие параметры заполняются автоматически: SOCIAL_AUTH_SAML_SP_ENTITY_ID, SOCIAL_AUTH_SAML_TECHNICAL_CONTACT и SOCIAL_AUTH_SAML_SUPPORT_CONTACT

Пример настроек:

# Authentication configuration
AUTHENTICATION_BACKENDS = (
    "social_core.backends.email.EmailAuth",
    "social_core.backends.saml.SAMLAuth",
    "weblate.accounts.auth.WeblateUserBackend",
)

# Social auth backends setup
SOCIAL_AUTH_SAML_SP_ENTITY_ID = f"https://{SITE_DOMAIN}/accounts/metadata/saml/"
SOCIAL_AUTH_SAML_SP_PUBLIC_CERT = "-----BEGIN CERTIFICATE-----"
SOCIAL_AUTH_SAML_SP_PRIVATE_KEY = "-----BEGIN PRIVATE KEY-----"
SOCIAL_AUTH_SAML_ENABLED_IDPS = {
    "weblate": {
        "entity_id": "https://idp.testshib.org/idp/shibboleth",
        "url": "https://idp.testshib.org/idp/profile/SAML2/Redirect/SSO",
        "x509cert": "MIIEDjCCAvagAwIBAgIBADA ... 8Bbnl+ev0peYzxFyF5sQA==",
        "attr_name": "full_name",
        "attr_username": "username",
        "attr_email": "email",
    }
}
SOCIAL_AUTH_SAML_ORG_INFO = {
    "en-US": {
        "name": "example",
        "displayname": "Example Inc.",
        "url": "http://example.com"
    }
}
SOCIAL_AUTH_SAML_TECHNICAL_CONTACT = {
    "givenName": "Tech Gal",
    "emailAddress": "technical@example.com"
}
SOCIAL_AUTH_SAML_SUPPORT_CONTACT = {
    "givenName": "Support Guy",
    "emailAddress": "support@example.com"
}

Конфигурация по умолчанию извлекает информацию о пользователе из следующих атрибутов, настраивает вашу IDP для их предоставления:

Атрибут

Ссылка на URL-адрес SAML

Полное имя

urn:oid:2.5.4.3

Имя

urn:oid:2.5.4.42

Фамилия

urn:oid:2.5.4.4

Эл. почта

urn:oid:0.9.2342.19200300.100.1.3

Имя пользователя

urn:oid:0.9.2342.19200300.100.1.1

Подсказка

Приведённый выше пример и образ Docker определяют IDP с именем weblate. Вам может понадобиться настроить эту строку как Relay в вашем IDP.

Авторизация через LDAP#

Авторизация через LDAP лучше всего реализовать с помощью пакета django-auth-ldap. Установить его вы можете как обычно:

# Using PyPI
pip install 'django-auth-ldap>=1.3.0'

# Using apt-get
apt-get install python-django-auth-ldap

Подсказка

Этот пакет включён в Docker-контейнер, смотреть Установка с помощью Docker’а.

Примечание

У модуля Python LDAP версии 3.1.0 есть некоторые несовместимости, которые могут помешать вам использовать эту версию. Если вы получили ошибку AttributeError: „module“ object has no attribute „_trace_level“, то может помочь понижение версии python-ldap до 3.0.0.

После установки пакета вы сможете подключить его к системе авторизации Django:

# Add LDAP backed, keep Django one if you want to be able to sign in
# even without LDAP for admin account
AUTHENTICATION_BACKENDS = (
    "django_auth_ldap.backend.LDAPBackend",
    "weblate.accounts.auth.WeblateUserBackend",
)

# LDAP server address
AUTH_LDAP_SERVER_URI = "ldaps://ldap.example.net"

# DN to use for authentication
AUTH_LDAP_USER_DN_TEMPLATE = "cn=%(user)s,o=Example"
# Depending on your LDAP server, you might use a different DN
# like:
# AUTH_LDAP_USER_DN_TEMPLATE = 'ou=users,dc=example,dc=com'

# List of attributes to import from LDAP upon sign in
# Weblate stores full name of the user in the full_name attribute
AUTH_LDAP_USER_ATTR_MAP = {
    "full_name": "name",
    # Use the following if your LDAP server does not have full name
    # Weblate will merge them later
    # 'first_name': 'givenName',
    # 'last_name': 'sn',
    # Email is required for Weblate (used in VCS commits)
    "email": "mail",
}

# Hide the registration form
REGISTRATION_OPEN = False

Примечание

Вы должны удалить значение 'social_core.backends.email.EmailAuth' из параметра AUTHENTICATION_BACKENDS, в противном случае пользователи смогут установить в Weblate свой пароль и пройти авторизацию, используя его. Оставление 'weblate.accounts.auth.WeblateUserBackend' необходимо для того, чтобы работали разрешения и анонимные пользователи. Также он позволит вам войти в систему, используя учётную запись локального администратора, если вы его создали (например, с помощью команды createadmin).

Использование пароля привязки#

Если вы не можете использовать для авторизации прямую привязку, вам нужно будет использовать поиск, и предоставить для поиска привязываемого пользователя. Например:

import ldap
from django_auth_ldap.config import LDAPSearch

AUTH_LDAP_BIND_DN = ""
AUTH_LDAP_BIND_PASSWORD = ""
AUTH_LDAP_USER_SEARCH = LDAPSearch(
    "ou=users,dc=example,dc=com", ldap.SCOPE_SUBTREE, "(uid=%(user)s)"
)

Интеграция с Active Directory#

import ldap
from django_auth_ldap.config import LDAPSearch, NestedActiveDirectoryGroupType

AUTH_LDAP_BIND_DN = "CN=ldap,CN=Users,DC=example,DC=com"
AUTH_LDAP_BIND_PASSWORD = "password"

# User and group search objects and types
AUTH_LDAP_USER_SEARCH = LDAPSearch(
    "CN=Users,DC=example,DC=com", ldap.SCOPE_SUBTREE, "(sAMAccountName=%(user)s)"
)

# Make selected group a superuser in Weblate
AUTH_LDAP_USER_FLAGS_BY_GROUP = {
    # is_superuser means user has all permissions
    "is_superuser": "CN=weblate_AdminUsers,OU=Groups,DC=example,DC=com",
}

# Map groups from AD to Weblate
AUTH_LDAP_GROUP_SEARCH = LDAPSearch(
    "OU=Groups,DC=example,DC=com", ldap.SCOPE_SUBTREE, "(objectClass=group)"
)
AUTH_LDAP_GROUP_TYPE = NestedActiveDirectoryGroupType()
AUTH_LDAP_FIND_GROUP_PERMS = True

# Optionally enable group mirroring from LDAP to Weblate
# AUTH_LDAP_MIRROR_GROUPS = True

Авторизация через CAS#

Авторизация через CAS может быть выполнена с помощью такого пакета, как django-cas-ng.

Первый шаг — раскрытие поля электронной почты пользователя через CAS. Раскрытие нужно настроить на самом сервере CAS, и оно требует, чтобы у вас был запущен CAS как минимум версии v2, поскольку CAS версии v1 вообще не поддерживает атрибуты.

Второй шаг — обновление Weblate для использования вашего сервера CAS и атрибутов.

Для установки django-cas-ng выполните команду:

pip install django-cas-ng

После установки пакета вы сможете подключить его к системе авторизации Django, изменив файл settings.py:

# Add CAS backed, keep the Django one if you want to be able to sign in
# even without LDAP for the admin account
AUTHENTICATION_BACKENDS = (
    "django_cas_ng.backends.CASBackend",
    "weblate.accounts.auth.WeblateUserBackend",
)

# CAS server address
CAS_SERVER_URL = "https://cas.example.net/cas/"

# Add django_cas_ng somewhere in the list of INSTALLED_APPS
INSTALLED_APPS = (..., "django_cas_ng")

Наконец, для связывания поля электронной почты с объектом пользователя может быть использован сигнал. Для этого необходимо импортировать сигнал из пакета django-cas-ng и подключить к этому сигналу свой код. Выполнение этого действия в файле настроек может вызвать проблемы, поэтому его код предлагается поместить:

  • В метод django.apps.AppConfig.ready() конфигурации вашего приложения

  • В проектовый файл urls.py (если у вас нет моделей)

from django_cas_ng.signals import cas_user_authenticated
from django.dispatch import receiver


@receiver(cas_user_authenticated)
def update_user_email_address(sender, user=None, attributes=None, **kwargs):
    # If your CAS server does not always include the email attribute
    # you can wrap the next two lines of code in a try/catch block.
    user.email = attributes["email"]
    user.save()

См.также

Django CAS NG

Настройка сторонней авторизации Django#

Как правило, с Weblate должен заработать любой плагин авторизации Django. Просто следуйте инструкциям для установки плагина и не забудьте оставить в способах авторизации пользователя Weblate.

Обычно установка заключается в том, чтобы добавить способ авторизации в список AUTHENTICATION_BACKENDS и установить соответствующее приложение авторизации (если таковое имеется) и добавить его в список INSTALLED_APPS:

AUTHENTICATION_BACKENDS = (
    # Add authentication backend here
    "weblate.accounts.auth.WeblateUserBackend",
)

INSTALLED_APPS += (
    # Install authentication app here
)