Пользовательские группы в Laravel Jetstream
- Введение
- Создание/Удаление пользовательской группы
- Проверка пользовательских групп
- Управление членами пользовательской группы
Введение
Если вы установили Jetstream с помощью параметра teams
, ваше приложение будет построено с поддержкой создания и управления пользовательских групп:
laravel new project-name --jet --teams
Пользовательские группы Jetstream
Пользовательские группы Jetstream могут работать не для всех приложений. Если это не работает для вашего варианта использования, смело создавайте приложение Jetstream, не основанное на команде, и самостоятельно добавляйте функции пользовательских групп в свое приложение.
Функции пользовательских групп Jetstream позволяют каждому зарегистрированному пользователю создавать несколько групп и входить в них. По умолчанию каждый зарегистрированный пользователь будет входить в «Персональную» группу. Например, если пользователь с именем «Sally Jones» создает новую учетную запись, он будет назначен в группу с именем «Sally's Team». После регистрации пользователь может переименовать эту группу или создать другие группы.
Создание/Удаление пользовательской группы
Доступ к представлению создания пользовательской группы осуществляется через раскрывающееся меню навигации пользователя в правом верхнем углу экрана.
Views / Pages
При использовании стека Livewire представление создания пользовательской группы отображается с использованием шаблона Blade resources/views/teams/create-team-form.blade.php
. При использовании стека Inertia это представление отображается с использованием шаблона resources/js/Pages/Teams/CreateTeamForm.vue
.
Actions
Логику создания и удаления пользовательской группы можно настроить, изменив соответствующие классы действий в каталоге app/Actions/Jetstream
. Эти действия включают CreateTeam
, UpdateTeamName
и DeleteTeam
. Каждое из этих действий вызывается, когда соответствующая задача выполняется пользователем в пользовательском интерфейсе приложения. Вы можете изменять эти действия по мере необходимости в зависимости от потребностей вашего приложения.
Проверка пользовательских групп
Доступ к информации о группах пользователя можно получить с помощью методов, предоставляемых трейтом Laravel\Jetstream\HasTeams
. Этот трейт автоматически применяется к модели вашего приложения App\Models\User
во время установки Jetstream. Этот трейт предоставляет множество полезных методов, которые позволяют вам работать с пользовательскими группами:
// Доступ к выбранной в данный момент группе пользователя...
$user->currentTeam : Laravel\Jetstream\Team
// Доступ ко всем группам (включая собственные), к которым принадлежит пользователь...
$user->allTeams() : Illuminate\Support\Collection
// Доступ ко всем группам пользователя...
$user->ownedTeams : Illuminate\Database\Eloquent\Collection
// Доступ ко всем группам, к которым пользователь принадлежит, но не владеет...
$user->teams : Illuminate\Database\Eloquent\Collection
// Доступ к "личной" группе пользователя...
$user->personalTeam() : Laravel\Jetstream\Team
// Определяем, владеет ли пользователь данной группой...
$user->ownsTeam($team) : bool
// Определяем, принадлежит ли пользователь к данной группе...
$user->belongsToTeam($team) : bool
// Получаем роль, назначенную пользователю в группе...
$user->teamRole($team) : \Laravel\Jetstream\Role
// Определяем, имеет ли пользователь данную роль в данной группе...
$user->hasTeamRole($team, 'admin') : bool
// Доступ к массиву всех разрешений, которые пользователь имеет для данной группы...
$user->teamPermissions($team) : array
// Определяем, есть ли у пользователя данное разрешение в группе...
$user->hasTeamPermission($team, 'server:create') : bool
Текущая пользовательская группа
У каждого пользователя в приложении Jetstream есть «текущая группа». Это группа, в которой пользователь активно просматривает ресурсы. Например, если вы создаете приложение-календарь, ваше приложение будет отображать предстоящие события календаря для текущей группы пользователя.
Вы можете получить доступ к текущей группе пользователя, используя отношение Eloquent $user->currentTeam
. Эту группу можно использовать для анализа других ваших запросов Eloquent:
return App\Models\Calendar::where(
'team_id', $request->user()->currentTeam->id
)->get();
Пользователь может переключить свою текущую группу через раскрывающееся меню профиля пользователя, доступное в панели навигации Jetstream.
Объект пользовательской группы
Объект группы, доступ к которому осуществляется через $user->currentTeam
или через запросы Eloquent, предоставляет множество полезных методов для проверки атрибутов и взаимосвязей группы:
// Доступ к владельцу группы...
$team->owner : \App\Models\User
// Получение всех пользователей группы, включая владельца...
$team->allUsers() : Illuminate\Database\Eloquent\Collection
// Получаем всех пользователей группы, кроме владельца...
$team->users : Illuminate\Database\Eloquent\Collection
// Определяем, является ли данный пользователь членом группы...
$team->hasUser($user) : bool
// Определяем, есть ли в группе участник с данным адресом электронной почты...
$team->hasUserWithEmail($emailAddress) : bool
// Определяем, является ли данный пользователь членом группы с данным разрешением...
$team->userHasPermission($user, $permission) : bool
Управление членами пользовательской группы
Члены группы могут быть добавлены и удалены через представление Jetstream «Team Settings». Логика серверной части, которая управляет этими действиями, может быть настроена путем изменения соответствующих действий, таких как класс App\Actions\Jetstream\AddTeamMember
.
Views / Pages управления участниками пользовательской группы
При использовании стека Livewire представление менеджера членов группы отображается с использованием шаблона Blade resources/views/teams/team-member-manager.blade.php
. При использовании стека Inertia это представление отображается с использованием шаблона resources/js/Pages/Teams/TeamMemberManager.vue
. Как правило, эти шаблоны не требуют настройки.
Действия управления участниками пользовательской группы
Логику добавления членов группы можно настроить, изменив класс действия App\Actions\Jetstream\AddTeamMember
. Метод add
класса вызывается с текущим аутентифицированным пользователем, экземпляром Laravel\Jetstream\Team
, адресом электронной почты пользователя, добавляемого в группу и ролью (если нужно) пользователя, добавляемого в группу.
Это действие отвечает за проверку того, что пользователь действительно может быть добавлен в группу, а затем за добавление пользователя в эту группу. Вы можете настроить это действие в соответствии с потребностями вашего конкретного приложения.
Роли / Разрешения
Каждому члену группы, добавленному в эту группу, может быть назначена определенная роль, и каждой роли назначается набор разрешений. Разрешения ролей определяются в JetstreamServiceProvider
вашего приложения с помощью метода Jetstream::role
. Этот метод принимает «slug» для роли, удобное для пользователя имя роли, разрешения роли и описание роли. Эта информация будет использоваться для отображения роли в представлении управления членами группы:
Jetstream::defaultApiTokenPermissions(['read']);
Jetstream::role('admin', 'Administrator', [
'create',
'read',
'update',
'delete',
])->description('Administrator может выполнять любое действие.');
Jetstream::role('editor', 'Editor', [
'read',
'create',
'update',
])->description('Editor может читать, создавать и обновлять.');
Поддержка API для пользовательских групп
Когда Jetstream устанавливается с поддержкой групп, доступные разрешения API автоматически выводятся путем объединения всех уникальных разрешений, доступных для ролей. Поэтому отдельный вызов методаJetstream::permissions
не требуется.
Авторизация
Конечно, вам понадобится способ авторизации того, что входящие запросы, инициированные членом группы, действительно могут выполняться этим пользователем. Разрешения группы пользователя могут быть проверены с помощью метода hasTeamPermission
, доступного через трейт Laravel\Jetstream\HasTeams
. Нет необходимости проверять роль пользователя. Вам нужно только проверить, есть ли у пользователя конкретное разрешение. Роли - это просто презентационная концепция, используемая для группировки отдельных разрешений. Как правило, вы будете выполнять вызовы этого метода в рамках политик авторизации вашего приложения:
if ($request->user()->hasTeamPermission($team, 'read')) {
// Роль пользователя включает разрешение на "чтение" (read)...
}
Объединение разрешений пользовательской группы с разрешениями API
При создании приложения Jetstream, которое обеспечивает как поддержку API, так и поддержку пользовательских групп, вы должны проверить разрешения группы входящего запроса и разрешения токена API в рамках политик авторизации вашего приложения. Это важно, потому что токен API может иметь теоретическую способность выполнять действие, в то время как пользователю фактически не предоставлено это действие через разрешения своей группы:
/**
* Определите, может ли пользователь просматривать 'flight'.
*
* @param \App\Models\User $user
* @param \App\Models\Flight $flight
* @return bool
*/
public function view(User $user, Flight $flight)
{
return $user->belongsToTeam($flight->team) &&
$user->hasTeamPermission($flight->team, 'flight:view') &&
$user->tokenCan('flight:view');
}
Перевод:
https://jetstream.laravel.com/1.x/features/teams.html
Заберите ссылку на статью к себе, чтобы потом легко её найти!
Раз уж досюда дочитали, то может может есть желание рассказать об этом месте своим друзьям, знакомым и просто мимо проходящим?
Не надо себя сдерживать! ;)