Модули аутентификации в PhpBB
Отредактировано: 04 Июня 2018
Начиная с версии phpBB 3.1 появились встроенные модули аутентификации, которые можно расширить или создавать самостоятельно.
На момент написания статьи, можно выбрать только 1 метод аутентификации, и этот метод выбирается во вкладке «Общие» административной панели, в пункте меню «Аутентификация».
Создание нового модуля аутентификации
Каждый модуль проверки подлинности состоит как минимум из 2 файлов:
-
php класс с условиями аутентификации;
-
запись в config/auth.yml файле, указывающая на php класс.
Модули проверки подлинности являющиеся частью дополнительных расширений должны предоставить свой собственный yaml файл.
Файл класса
Файл с конструктором поставщика будет выполнятся надлежащим образом, находясь по адресу \phpbb\auth\provider\provider_interface.
При модернизации кода указанного в файле \phpbb\auth\provider\base, не рекомендуется добавлять ненужные методы, во избежании поломки при обновлении ядра форума.
Примерное наполнение файла:
<?php
namespace acme\demo\auth\provider;
/**
* Database authentication provider for phpBB3
*
* This is for authentication via the integrated user table
*/
class db2 extends \phpbb\auth\provider\base
{
/** @var \phpbb\db\driver\driver_interface $db */
protected $db;
/**
* Database Authentication Constructor
*
* @param \phpbb\db\driver\driver_interface $db
*/
public function __construct(\phpbb\db\driver\driver_interface $db)
{
$this->db = $db;
}
/**
* {@inheritdoc}
*/
public function login($username, $password)
{
// Auth plugins get the password untrimmed.
// For compatibility we trim() here.
$password = trim($password);
// do not allow empty password
if (!$password)
{
return array(
'status' => LOGIN_ERROR_PASSWORD,
'error_msg' => 'NO_PASSWORD_SUPPLIED',
'user_row' => array('user_id' => ANONYMOUS),
);
}
if (!$username)
{
return array(
'status' => LOGIN_ERROR_USERNAME,
'error_msg' => 'LOGIN_ERROR_USERNAME',
'user_row' => array('user_id' => ANONYMOUS),
);
}
$username_clean = utf8_clean_string($username);
$sql = 'SELECT user_id, username, user_password, user_passchg, user_pass_convert, user_email, user_type, user_login_attempts
FROM ' . USERS_TABLE . "
WHERE username_clean = '" . $this->db->sql_escape($username_clean) . "'";
$result = $this->db->sql_query($sql);
$row = $this->db->sql_fetchrow($result);
$this->db->sql_freeresult($result);
// Successful login... set user_login_attempts to zero...
return array(
'status' => LOGIN_SUCCESS,
'error_msg' => false,
'user_row' => $row,
);
}
}
Сервисный файл
Для правильной интеграции нового провайдера в админку форума, надо добавить соответствующую запись в файл services.yml. Имя сервиса должно быть записано в формате auth.provider.<service name>. Аргументы должны быть указаны в конструкторе поставщика, и могут быть пустыми. Поставщик должен обозначаться меткой { name: auth.provider }, для того чтобы был доступен в админ панели PhpBB.
services:
auth.provider.db2:
class: acme\demo\auth\provider\db2
arguments:
- '@dbal.conn'
tags:
- { name: auth.provider }
Шаблон
Чтобы администратор мог настраивать плагин, доступные поля должны быть созданны и доступны в плагину php-auth-provider. Этот интерфейс конфигурируется в формате HTML в файле adm/style/auth_provider_<providername>.html.
Пример ниже основан на существующих терминах LDAP, используемых для настройки HTTPS-сервера:
<fieldset id="auth_test_settings">
<legend>{TEST}</legend>
<dl>
<dt><label for="https_server">{TEST_SERVER}{L_COLON}</label><br /><span>{TEST_SERVER_EXPLAIN}</span></dt>
<dd><input type="text" id="https_server" size="40" name="config[https_server]" value="{AUTH_HTTPS_SERVER}" /></dd>
</dl>
</fieldset>
Значение можно извлечь из <provider>.php файла следующим образом:
$domain = $this->config['https_server'];
OAuth аутентификация и добавление нового поставщика
Начиная с версии phpBB 3.1 поставляется с новым поставщиком аутентификации: OAuth, он основан на библиотеке Lusitanian / PHPoAuthLib.
Для создания новой службы проверки OAuth надо:
-
создать php класс, который будет определять функционал;
-
сделать запись в config/auth.yml файле, указывающую на php класс.
Файл класса
Адрес для размещения класса \phpbb\auth\provider\provider_interface
В приведенных ниже примерах показано минимальное значение, необходимое для включения службы OAuth в phpBB.
Примерное наполнение файла класса:
<? php
/ **
*
* Этот файл является частью пакета программного обеспечения phpBB Forum.
*
* @ Авторское право (c) phpBB Limited <https://www.phpbb.com>
* @license GNU General Public License, версия 2 (GPL-2.0)
*
* Для получения полной информации об авторских правах и лицензии см.
* документы / Файл CREDITS.txt.
*
* /
namespace phpbb \ auth \ provider \ oauth \ service ;
/ **
* Bitly OAuth service
* /
class bitly extends \ phpbb \ auth \ provider \ oauth \ service \ base
{
/ **
* phpBB config
*
* @var \ phpbb \ config \ config
* /
protected $ config ;
/ **
* запрос phpBB
*
* @var \ phpbb \ request \ request_interface
* /
protected $ request ;
/ **
* Constructor
*
* @param \ phpbb \ config \ config $ config
* @param \ phpbb \ request \ request_interface $ request
* /
public function __construct ( \ phpbb \ config \ config $ config , \ phpbb \ request \ request_interface $ request )
{
$ this -> config = $ config ;
$ this -> request = $ request ;
}
/ **
* {@inheritdoc}
* /
public function get_service_credentials ()
{
return array (
'key' => $ this -> config [ 'auth_oauth_bitly_key' ],
'secret' => $ this -> config [ 'auth_oauth_bitly_secret' ],
);
}
/ **
* {@inheritdoc}
* /
public function perform_auth_login ()
{
if ( ! ($ this -> service_provider instanceof \ OAuth \ OAuth2 \ Service \ Bitly ))
{
throw new \ phpbb \ auth \ provider \ oauth \ service \ exception ( 'AUTH_PROVIDER_OAUTH_ERROR_INVALID_SERVICE_TYPE' );
}
// Это был запрос обратного вызова из битлы, получить токен
$ this -> service_provider -> requestAccessToken ( $ this -> request -> variable ( 'code' , '' ));
// Отправить запрос с ним
$ result = json_decode ( $ this ->service_provider -> request ( 'user / info' ), true );
// Возвращаем уникальный идентификатор, возвращаемый с битового
возврата $ result [ 'data' ] [ 'login' ];
}
/ **
* {@inheritdoc}
* /
public function perform_token_auth ()
{
if ( ! ( $ this -> service_provider instanceof \ OAuth \ OAuth2 \ Service \ Bitly ))
{
throw new \ phpbb \ auth \ provider \ oauth \ service \ exception ('AUTH_PROVIDER_OAUTH_ERROR_INVALID_SERVICE_TYPE' );
}
// Отправить запрос с ним
$ result = json_decode ( $ this -> service_provider -> request ( 'user / info' ), true );
// Возвращаем уникальный идентификатор, возвращаемый с битового
возврата $ result [ 'data' ] [ 'login' ];
}
}
Файл службы
Чтобы phpBB мог правильно распознать файл сервиса, он должен быть записан в формате auth.provider.oauth.service.<service name>
services :
auth.provider.oauth.service.bitly :
class : phpbb \ auth \ provider \ oauth \ service \ bitly
arguments :
- '@config'
- '@request'
теги :
- { name : auth.provider.oauth.service }