Пользовательские группы в Laravel Jetstream
Пользовательские группы в Laravel Jetstream

Пользовательские группы в 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.

Пользователь может переключить свою текущую группу через раскрывающееся меню профиля пользователя, доступное в панели навигации 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

Заберите ссылку на статью к себе, чтобы потом легко её найти!
Раз уж досюда дочитали, то может может есть желание рассказать об этом месте своим друзьям, знакомым и просто мимо проходящим?
Не надо себя сдерживать! ;)

Старт! Горячий старт на просторы интернета
Старт! Горячий старт на просторы интернета
Старт! Меню