Автор оригинала: David Wong.
приказ
Управление привилегиями является основным модулем беспроводной операционной системы. Взаимосвязь доступа между людьми и ресурсами определяется конфигурацией стратегии управления доступом.
Эта статья посвящена тому, как создать гибкую, универсальную и безопасную систему управления привилегиями с помощью PHP.
О юрисдикции
Во-первых, давайте поговорим о разрешениях.
Система привилегий всегда была неотъемлемой частью нашей системы подачи заявок. Если каждая прикладная система изменит свои привилегии в соответствии с потребностями пользователей разных систем, это приведет к потере много драгоценного времени. Поэтому имеет смысл потратить время на разработку относительно универсальной системы привилегий.
Системные цели Управление доступом к общим объектам и информационным ресурсам прикладной системы, таким как Функциональное меню прикладной системы, кнопки различных интерфейсов, столбцы отображения данных и различные данные на уровне строк Выполните контроль разрешений.
Модель разрешений
В начале разработки мы изучили IAM Amazon. После сравнительного анализа мы, наконец, выбрали модель RBAC3 для руководства проектированием системы.
RBAC считает, что на самом деле авторизация-это вопрос о том, кто, что и как. В модели RBAC, кто, что и как составляют тройку доступа, то есть “Что действует на что (что)”.
Кто: Пользователи или участники разрешений (например, Участник, Пользователь, Группа, Роль, Актер и т.д.)
Что: Объекты или ресурсы (Ресурсы, классы), на которые направлены разрешения.
Как: Конкретные разрешения (привилегии, положительные и отрицательные).
Оператор: Оператор. Указывает, как выполняется операция над чем. Это Привилегия + Ресурс.
Роль: Роли, набор разрешений. Цель единицы и носителя распределения разрешений состоит в том, чтобы изолировать логическую связь между Пользователем и Привилегиями.
Путь архитектуры PHP
” Как построить наш центр управления с помощью PHP”
Далее мы начнем со Спецификации кодирования, Управления зависимостями, Архитектуры источника данных, Обработки данных, Модульного тестирования Испытывая волшебное путешествие PHP.
Спецификация кодирования
Хорошие спецификации кодирования могут улучшить читабельность программного обеспечения, способствовать росту команды, уменьшить количество ошибок и снизить затраты на техническое обслуживание. (Итак, X, мы должны продвигать его)
Сообщество PHP процветает и имеет большое количество функциональных библиотек, фреймворков и компонентов, поэтому очень важно, чтобы PHP-код следовал или подходил к одному и тому же стилю кода, насколько это возможно.
Группа совместимости фреймворков (Группа стандартов PHP) выпустила серию рекомендуемых стилей.
Читать PSR-0
Прочитайте PSR-1
Прочитайте PSR-2 Руководство по стилю кодирования
Прочитайте загрузчик PSR-4
Структура каталогов центра разрешений:
-- /tuniu/rbac |-- src || -- App//Application Modeling Layer | | |-- City.php | | |-- Cms.php | | |-- Menu.php | |-- App.php | |-- Auth.php || -- Orm//ActiveRecord layer | | |-- App | | | |-- Resource | | | | |-- Map.php | | | |-- Resource.php | | | |-- User.php | | |-- App.php | | |-- Log.php | | |-- Role | | | |-- User.php | | |-- Role.php | | |-- Rule.php | | |-- User.php | |-- Orm.php | |-- Utils.php | -- Tests//Tests | |-- bootstrap.php | |-- fixtures | | |-- null.yml | | |-- rbac | | | |-- app.yml | | | |-- auth.yml | | | |-- role.yml | |-- rbac | | |-- appTest.php | | |-- authTest.php | | |-- roleTest.php |-- vendor |-- composer.json |-- composer.lock |-- phpunit.xml |-- README.md
PSR-2, Класс ресурсов привилегированного приложения:
namespace Tuniu\Rbac\Orm\App;
use Tuniu\Rbac\Orm;
use Tuniu\Rbac\Orm\App;
use Tuniu\Rbac\Orm\App\Resource\Map;
use Tuniu\Rbac\Orm\Rule;
use Tuniu\Rbac\Orm\User;
class Resource extends Orm {}
PSR-4, Соглашения о пространстве имен:
\<\<Имя пространства имен>(\<Имена подпространств>)*\<Имя класса>
| /tuniu/rbac/src/Orm/App/Resource.php | \Tuniu\Rbac\Orm\Приложение\Ресурс |
| /tuniu/rbac/src/App/Cms.php | \Tuniu\Rbac\Приложение\Cms |
Управление зависимостями
Composer-это инструмент для управления отношениями зависимостей в PHP. Вы можете объявить библиотеки, от которых вы зависите, в своем проекте, и Composer поможет вам установить библиотеки, от которых вы зависите.
Объявление зависимости центра полномочий:
{
"name": "tuniu/rbac",
"Require": {Declare dependencies
"php": ">=5.3.0",
"Squizlabs/php_codesniffer": "2. *", //PHP_CodeSniffer Check Code Specification
"php-activerecord/php-activerecord": "dev-master" //ActiveRecord
},
"Require-dev": {declare development dependencies
"phpunit/phpunit": "~4.6",
"phpunit/dbunit": ">=1.2"
},
"autoload": {
"psr-4": {
"TuniuRbac\\":"src/"//namespace
}
}
}Проверьте спецификации кода и выполните модульные тесты.
$./vendor/bin/phpcs --config-set default_standard PSR2 $./vendor/bin/phpcs src $./vendor/bin/phunit
^^^^^^ Вяжущее действие на глаза, глазная кислота, усталость глаз, как это сделать…
Саксонец, если удобно, попробуй соскользнуть вниз…
Борьба за переправу, борьба за переправу, спугнуть чайку-цаплю.
Архитектура источника Данных
Основываясь на взаимосвязи между таблицами центра управления (всевозможные ассоциации, обратные вызовы), традиционный режим неизбежно будет потреблять энергию в бесконечном цикле.
В результате мы начали искать архитектурную модель для источников данных, и ActiveRecord появился надежно.
Активная запись (китайское название: Запись активности) – это шаблон модели домена, характеризуемый классом модели, соответствующим таблице в реляционной базе данных, и экземпляром класса модели, соответствующим строке записей в таблице.
PHP ActiveRecord-это библиотека PHP/ORM с открытым исходным кодом, основанная на шаблоне проектирования ActiveRecord. Он направлен на значительное упрощение взаимодействия с базой данных и сокращение количества написанных от руки SQL-инструкций. В отличие от других форм, вам не нужно использовать какие-либо генераторы кода, и вам не нужно вручную писать и поддерживать файлы сопоставления таблиц слоев моделей. Библиотека была вдохновлена Ruby on Rails, поэтому она также позаимствовала идеи и реализации у Ruby on Rails. (Кто знает, с кем)
Вот как этот маленький приятель увлекается программированием:
Утверждение
проверяет наличие
подтверждение_включение_оф
Сценарии (соглашения о данных таблицы ролей)
/**
* 1: Scope of agreed role types
* 2: Scope of agreed role status
*/
public static $validates_inclusion_of = array(
array('f_type', 'in' => array('role', 'group', 'department', 'member')),
array('f_status', 'in' => array(1,2))
);
/**
* Setting role name, role status, role type, role description cannot be empty
*/
public static $validates_presence_of = array(
array('f_name'),
array('f_status'),
array('f_type'),
array('f_desc')
);
// If the input data does not meet the stipulated conditions, it can not be saved, and there is no need to worry about those dirty data.Обратный звонок
до_сохранения
перед созданием
перед обновлением
до_дестройки
после_сохранения
after_create
after_update
after_destroy
Сценарий 1 (Оперативные записи в Таблице Ролей)
// Define callback function
public static $before_save = array('setMisc');
// Every time before the role table is saved, the data format is good silently, so happy...
public function setMisc()
{
// Create time, Creator
$this->is_new_record() && ($this->f_create_at = date("Y-m-d H:i:s"));
$this->is_new_record() && ($this->f_create_by = $this->op);
// Update time, update person
$this - > f_update_by = this - > op; // operator
$this - > f_update_at = date ("Y-m-d H:i:s"); //operation time
}Сценарий 2 (Добавление ресурсов, таблица сопоставления ресурсов push):
// Define callback function
public static $after_save = array('syncRelations');
// Whenever the resource is saved, the mapping field values in the resource data are automatically pushed to the resource mapping table.
public function syncRelations()
{
// Get mapping fields for resources
$mapFiledValue = $this->getMapFiledValue();
$mapFiledValue
? $this->addMap($mapFiledValue)
: Map::removeAllByResourceId($this->id);
}Сценарий 3 (удаление роли):
// Define callback function
public static $after_destroy = array('deleteRelations');
// Whenever a role is deleted, the resource rules of the members and roles of the roles in the system are automatically emptied and transactional.
public function deleteRelations()
{
UserRelations::removeAllByRoleId($this->id);
RuleRelatinos::removeAllByRoleId($this->id);
}Ассоциация (Ассоциация)
has_many
Сценарии (пользователи с новыми ролями)
// Define the relationship between the role table and the role user table
public static $has_many = array(
array(
'relations',
'foreign_key' => 'f_role_id',
'class_name' => "\Tuniu\Rbac\Orm\Role\User",
)
);
// Adding new role users, silently passing role_id to the role user table, if you use SQL here, you can hardly bear to look straight at it.
Role::first()->create_relation(
array(
'f_user_id' => $uid
)
);Транзакции (Согласованность и безопасность)
Важность согласованности данных и безопасности данных в системе привилегий очевидна. Транзакции не требуются BS.
Здесь мы торжественно обещаем, что каждый запрос на добавление, удаление и изменение данных в системе привилегий является транзакционным.
Например, сохранение ролей:
self::transaction(
function () use ($params, &$role) {
$role->f_name = $params['name'];
$role->f_status = $params['status'];
$role->f_type = $params['type'];
$role->f_desc = $params['desc'];
if ($role->is_invalid()) {
Throw new Exception ('role related operation failed','900202');
}
$role->save();
}
);Пространство ограничено, и боевые сцены этого маленького компаньона намного больше, чем это.
Откровенно говоря, использование AR-это своего рода удовольствие от программирования.
Модульное тестирование (непрерывная поставка)
Все настолько идеально, без тестирования, как мы можем доказать совершенство этого дела и как мы можем гарантировать качество доставки.
PHPUnit-это легкая платформа для тестирования PHP. Это полная миграция версий серии JUnit 3 под PHP 5 и является членом семейства тестовых фреймворков xUnit (все они основаны на дизайне пионера шаблонов Кента Бека).
Модульное тестирование-очень эффективный способ повышения качества программного обеспечения, но очень важно, чтобы мы практиковали и испытывали его на практике.
В этой статье кратко представлены тестовые примеры ролевого поведения в управлении разрешениями.
Тестирование ролевого Поведения
Набор данных (YAML)
t_rbac_user:
-
f_id: 1
f_name: "zhaoyang2"
f_create_at: "2013-10-10 17:04:05"
t_rbac_role_user:
-
f_id: 1
f_user_id: 1
f_role_id: 1
t_rbac_role:
-
f_id: 1
F_name: "Operational R&D Department-1"
f_status: 1,
f_type: "department"
F_desc: "We are Operations Research and Development Department-1"
f_create_at: "2013-10-10 17:04:05"
f_create_by: "zhaoyang2"
f_update_by: "zhaoyang2"Тестовый код:
// Preset Data Set
public function getDataSet()
{
return new \PHPUnit_Extensions_Database_DataSet_YamlDataSet(
fixture('rbac/role.yml')
);
}
/**
* Permission operation - exception validation
* @expectedException Exception
*@ Expected Exception Message You do not have the right to operate the current data
*/
public function testRoleDeleteException()
{
Role::first()->remove();
}
/**
* Privilege Operations - Delete Validation
*/
public function testRoleDelete()
{
Role::first()->remove("zhaoyang2");
// Verify data rows
$this->assertEquals(1, $this->getConnection()->getRowCount(Role::$table_name));
$this->assertEquals(1, $this->getConnection()->getRowCount(UserRelation::$table_name));
}Варианты использования аутентификации и варианты использования управления приложениями намного сложнее, чем это. Заинтересованные студенты могут отправиться в Форк, чтобы узнать о прелестях PHPUNIT.
PHPUNIT очень мощный. Если вы хотите использовать его правильно, ярлыка нет. Начните писать тестовые примеры.
Заключительные замечания
На самом деле архитектура-это способ поделиться с вами PHP центра управления.
Эффективное и удобное использование PHP-сервисов в нашей работе.
Больше общайтесь, больше делитесь, пишите лучший PHP-код, наслаждайтесь радостью программирования и технологий.
RBAC
Путь PHP
Глубокое понимание ядра PHP
Оригинал: “https://developpaper.com/the-way-of-php-architecture-of-tunius-original-dahua-authority-center/”