Advertisement
  1. Code
  2. PHP

Как программировать с Yii2: элементы управления доступом к пользователю

by
Read Time:10 minsLanguages:
This post is part of a series called How to Program With Yii2.
How to Program With Yii2: Localization With I18n
How to Program With Yii2: Rich Text Input With Redactor

Russian (Pусский) translation by Ilya Nikov (you can also view the original English article)

Final product imageFinal product imageFinal product image
What You'll Be Creating

Если вы спрашиваете: «Что такое Yii?» ознакомьтесь с моим предыдущим учебным пособием: Введение в Yii Framework, в котором рассматриваются преимущества Yii и которое включает обзор нового в Yii 2.0, выпущенного в октябре 2014 года.

В этой серии статей программирование с Yii2 я направляю читателей в использование недавно обновленного Yii2 Framework для PHP.

В первой части мы настраивали Yii2 локально, создавали приложение Hello World, настраивали удаленный сервер и использовали Github для развертывания нашего кода. Во второй части мы узнали о реализации Yii своей архитектуры Model View Controller и о том, как создавать веб-страницы и формы, которые собирают и валидируют данные.

В третьей части мы использовали базы данных Yii и возможности ActiveRecord для автоматизации генерации кода для базового веб-приложения. В четвертой части мы узнали, как интегрировать регистрацию пользователей. И в пятой части мы изучили локализацию с I18n для подготовки вашего приложения для глобальных пользователей.

В этом уроке я покажу вам, как реализовать средства контроля доступа, чтобы гарантировать, что только нужные пользователи смогут получить доступ к частям нашего приложения.

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

Просто напоминание, что я участвую в нижеуказанных комментариях. Меня особенно интересует, если у вас разные подходы, дополнительные идеи или вы хотите предложить темы для будущих учебников.

Что такое контроль доступа?

Контроль доступа интегрируется с функциями аутентификации фреймворка, чтобы разрешить или ограничить доступ к определенным функциям или страницам вашего веб-сайта.

Код, который мы написали до сих пор, позволяет кому-либо создавать сообщения, даже если они не вошли в систему. Например, в нашем примере приложения вы можете посетить страницу состояния и опубликовать что-нибудь даже не логинясь.

Мы можем использовать простые функции управления доступом Yii2, чтобы пользователи регистрировались и логинились перед добавлением и просмотром сообщений о статусе.

Yii2 также предлагает более продвинутый (и комплексный) контроль доступа на основе ролей (RBAC), который мы не будем внедрять в настоящее время. С RBAC вы определяете сложную иерархию разрешений для каждой возможной деятельности в вашем приложении.

Встроенный в систему управления доступом Yii2 поддерживает только две роли по умолчанию: гость (не вошедший в систему), представленный «?» и аутентифицированный, представленный «@». С помощью простых элементов управления доступом мы можем просто ограничить доступ к определенным страницам или действиям контроллера в зависимости от состояния входа. Если пользователи не вошли в систему при посещении нужных страниц, Yii перенаправит их на страницу входа.

В этом уроке я расскажу вам об использовании простых элементов управления Yii2 для нашего тестового приложения. Затем мы расширим простой доступ с дополнительными ролями, такими как модератор и администратор.

Внедрение простых элементов управления доступом

В настоящее время наше приложение разрешает доступ к StatusController даже без входа. Давайте исправим это.

Status Controller Open access to anything regardless of login stateStatus Controller Open access to anything regardless of login stateStatus Controller Open access to anything regardless of login state

Фреймворк упрощает реализацию этих элементов управления. Мы просто добавляем поведение к StatusController.php, которое определяет правила доступа для каждого действия, например. index, create, view и т. д.

Здесь мы рассмотрим поведение доступа, но если вам интересно, фильтры Yii позволяют вам ограничивать операции HTTP-запроса на основе действия вашего контроллера.

После добавления, если вы нажмете меню Status, вы будете перенаправлены на страницу входа:

StatusController Redirect to Login Page with Access ControlStatusController Redirect to Login Page with Access ControlStatusController Redirect to Login Page with Access Control

Yii также обрабатывает перенаправление обратно на страницу индекса Status после завершения входа.

Добавление владения моделью

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

Yii::$app->user->getId();

И мы можем связать сообщения статуса с их создателем в модели.

Чтобы сделать это, мы должны расширить таблицу Status с новой миграцией таблицы:

Вот код миграции, который добавляет столбец для created_by. Мы также добавляем внешний ключ для создания связи между полем Status-> created_by и таблицей User->id.

Перейдем к миграции:

Я перезапустил генерацию кода Gii с новой таблицей состояния, скопировал и вставил новые дополнительные элементы. Большинство из них были незначительными, но вы заметите, что добавлен новый ActiveQuery для отношения:

Итак, перед сохранением новых элементов статуса мы можем обновить поле created_by для текущего пользователя. И мы можем доверять элементам управления доступом, чтобы обеспечить доступ к методу create только у пользователей, прошедших аутентификацию:

Мы также расширим виджет вида, включив в него поле created_by:

Status Detail View Showing Created By User IdStatus Detail View Showing Created By User IdStatus Detail View Showing Created By User Id

Мы также можем использовать отношение created_by для отображения адреса электронной почты:

createdBy.email обращается к методу отношения Status::getCreatedBy. Появится адрес электронной почты пользователя:

Однако, чтобы поддержать эту возможность с расширением Yii2-user, которое мы реализовали в четвертой части, нам пришлось внести две модификации. Во-первых, в нашем конфигурационном массиве app\config\web.php мы добавили переопределение модели в app\models\User.php:

Мы также создали эту модель в app\models:

Эти два изменения обеспечили поддержку отношения.

Расширение простых элементов управления доступом

Что делать, если мы хотим иметь дополнительную возможность для действий контроллера? Например, что делать, если мы хотим ограничить операции удаления модераторами или администраторами? У простого контроля доступа Yii2 нет модератора или концепции администратора, если вы не создадите его с помощью RBAC.

Обратите внимание, что расширение Yii2-user имеет идентификатор администратора для определенных пользователей, но также не хватает гибкости для дополнительных ролей.

The Code Ninja написал хороший пример расширения простых элементов управления доступом для поддержки модераторов и администраторов (упрощенная авторизация на основе ролей в Yii 2.0), не прибегая к использованию RBAC. Их пример работает с расширенным шаблоном приложения Yii2.

Наше приложение отличается тем, что мы используем шаблон базового приложения Yii, и мы используем расширение Yii2-user. Поэтому я внес некоторые изменения в их руководство:

Сначала мы создаем каталог app\components и файл AccessRule.php, который расширяет внутреннюю модель Yii AccessRule:

Затем мы добавляем определения ролей в нашу модель app\models\User:

Yii2-user не создает столбец роли при создании новых пользователей. Таким образом, вы можете указать роли для модераторов и администраторов вручную в MySQL или позже создать собственный веб-интерфейс для предоставления ролей.

В vendor\dektrium\yii2-user\models\RegistrationForm.php я добавил эту строку, чтобы определить роль пользователя по умолчанию:

Примечание: вам нужно будет внести это изменение вручную, если вы этого захотите, потому что мой каталог vendor не попадает в дерево GitHub, и да, возможно есть более элегантный способ сделать это в основной кодовой базе после регистрации , например расширьте метод createUser в app/models/User.php. Лучшей практикой может быть форк репозитория vendor и внесение его в ваше собственное дерево кода.

Наконец, в StatusController.php мы добавляем некоторые библиотеки и эти определения доступа. В приведенном ниже примере действия update ограничены модераторами, а действия с удалением ограничиваются администраторами.

Теперь, когда вы выходите из системы и просматриваете страницу Status на панели навигации, вы попадаете на экран входа в систему:

Login Access RestrictionLogin Access RestrictionLogin Access Restriction

Когда вы войдете в систему, вас снова отправят на страницу index:

Authenticated View of Status Index PageAuthenticated View of Status Index PageAuthenticated View of Status Index Page

Однако, если я нажму «Удалить», я получу эту ошибку прав доступа, потому что я скромный пользователь, а не администратор:

Access Forbidden Due to User RoleAccess Forbidden Due to User RoleAccess Forbidden Due to User Role

Если вы хотите поднять себя до администратора, вы можете сделать это в базе данных, изменив столбец ролей таблицы пользователя для вашего user_id до 20 для модератора и 30 для администратора. Повторите операцию обновления и удаления, и вам будет разрешено в зависимости от выбранной вами роли.

Контроль доступа - одна из многих функций, которые делают меня огромным сторонником использования Yii Framework. Yii делает меня намного более эффективным разработчиком, способным предлагать решения гораздо быстрее, чем если бы я делал это с помощью ванильного PHP.

Что дальше?

Следите за новыми учебниками из этой серии. Вы также можете ознакомиться с моей серией Пишем свой стартап на PHP, в которой используется расширенный шаблон Yii2, где я создаю реальное приложение.

Если вы хотите узнать, когда выйдет следующий учебник по Yii2, подпишитесь на меня @reifman в Twitter или посетите мою страницу инструктора. Моя страница инструктора будет включать все статьи из этой серии, как только они будут опубликованы. Вы также можете написать мне по электронной почте на моем веб-сайте Lookahead Consulting.

Ссылки по теме

Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.