Gerenciamento de Usuários - ime-usp-br/laravel_11_starter_kit GitHub Wiki
Gerenciamento de Usuários, Papéis e Permissões
O Projeto Base USP utiliza o pacote spatie/laravel-permission
para fornecer um sistema flexível de controle de acesso baseado em papéis (Roles) e permissões (Permissions). Além disso, integra funcionalidades básicas de gerenciamento de usuários na área administrativa, incluindo a capacidade de criar usuários buscando dados do sistema Replicado da USP.
Estrutura de Papéis e Permissões
Conceitos
- Permissão (Permission): Define uma ação específica que um usuário pode ou não realizar (ex: 'editar artigo', 'ver relatórios financeiros', 'acessar área admin'). No contexto do Senha Única, também representa vínculos (ex: 'Docente', 'Alunogr') ou níveis hierárquicos ('admin', 'manager').
- Papel (Role): Um agrupamento de permissões. Atribuir um papel a um usuário concede a ele todas as permissões associadas àquele papel (ex: o papel 'Editor' pode ter as permissões 'criar artigo', 'editar artigo', 'publicar artigo').
- Guards: Mecanismos de autenticação. O
spatie/laravel-permission
permite associar papéis e permissões a guards específicos. No projeto base, usamos principalmente:web
: O guard padrão do Laravel para sessões web. Permissões e papéis específicos da sua aplicação devem usar este guard.senhaunica
: (Ou o nome definido emUser::$vinculoNs
eUser::$hierarquiaNs
) Usado internamente pelo pacoteuspdev/senhaunica-socialite
para gerenciar as permissões hierárquicas e de vínculo vindas da autenticação USP.
Papéis e Permissões Padrão
O seeder Database\Seeders\RolesAndPermissionsSeeder
é executado durante a instalação (php artisan db:seed
) e cria os seguintes itens essenciais:
- Papéis Padrão (Guard
web
):admin
: Para administradores do sistema.usp_user
: Atribuído automaticamente a usuários registrados como "Comunidade USP" ou criados via busca no Replicado.external_user
: Atribuído automaticamente a usuários registrados como "Externo".- Você pode adicionar outros papéis específicos da sua aplicação aqui ou em migrations/seeders próprios.
- Permissões Padrão (Guard
senhaunica
):- Hierárquicas:
admin
,boss
,manager
,poweruser
,user
(definidas emApp\Models\User::$permissoesHierarquia
). - Vínculo:
Servidor
,Docente
,Estagiario
,Alunogr
,Alunopos
, etc. (definidas emApp\Models\User::$permissoesVinculo
). Permissões mais específicas comoDocente.ACL
ouAlunogr.8
podem ser criadas dinamicamente durante o login/criação do usuário.
- Hierárquicas:
Importante: O pacote uspdev/senhaunica-socialite
gerencia automaticamente a atribuição/sincronização das permissões do guard senhaunica
durante o login via Senha Única. A área administrativa do projeto base foca no gerenciamento dos papéis e permissões do guard web
.
/admin
)
Área Administrativa (Uma seção dedicada para funcionalidades administrativas, acessível apenas para usuários com o papel admin
.
- Acesso: Requer que o usuário esteja logado e possua o papel
admin
(atribuído manualmente ou viaSENHAUNICA_ADMINS
no.env
). O item "Área Administrativa" aparecerá no menu principal para esses usuários. - Dashboard Admin (
/admin/dashboard
): Página inicial da área administrativa, contendo links para as funcionalidades disponíveis.
Funcionalidades de Gerenciamento de Usuários
- Listar Usuários (
/admin/users
):- Controller:
App\Http\Controllers\Admin\UserController::index()
- View:
resources/views/admin/users/index.blade.php
- Descrição: Exibe uma tabela paginada com todos os usuários registrados no banco de dados local. As colunas incluem: ID, Nome, Email, Nº USP (CodPes, se houver), Papéis (do guard
web
), Status de Verificação de Email e Data de Criação. Fornece links para as ações de criação.
- Controller:
- Criar Usuário USP (via Replicado) (
/admin/users/create/usp
):- Controller:
App\Http\Controllers\Admin\UserController::createUsp()
(GET),storeUsp()
(POST) - View:
resources/views/admin/users/create_usp.blade.php
- Descrição: Permite ao administrador criar um novo usuário buscando informações básicas diretamente do sistema Replicado da USP.
- Fluxo:
- Admin insere o Número USP (CodPes) do usuário desejado.
- Ao submeter, o controller
storeUsp()
utiliza o pacoteuspdev/replicado
(Pessoa::fetch
,Pessoa::email
) para buscar o nome completo e o email principal do usuário no Replicado. - Validações: Verifica se o Nº USP foi encontrado, se possui email principal e se o Nº USP ou email já não existem na tabela
users
. - Se válido, cria um novo registro na tabela
users
com os dados obtidos. - Atribui automaticamente o papel
usp_user
. - Marca o email como verificado (
email_verified_at
preenchido), pois a fonte (Replicado) é confiável. - Gera uma senha inicial aleatória segura.
- Redireciona para o dashboard admin com uma mensagem de sucesso exibindo a senha inicial gerada.
- ATENÇÃO PRODUÇÃO: O método de informar a senha inicial (via flash message) NÃO é seguro para produção. Recomenda-se modificar este fluxo para enviar a senha via um canal seguro, forçar o usuário a redefinir a senha no primeiro login ou usar um fluxo de convite.
- Controller:
- Criar Usuário Manualmente (
/admin/users/create/manual
):- Controller:
App\Http\Controllers\Admin\UserController::createManual()
(GET),storeManual()
(POST) - View:
resources/views/admin/users/create_manual.blade.php
- Descrição: Permite ao administrador criar um novo usuário (USP ou externo) fornecendo todas as informações manualmente.
- Fluxo:
- Admin preenche: Nome Completo, Email, Senha, Confirmação de Senha.
- O campo Número USP (CodPes) é opcional.
- Ao submeter, o controller
storeManual()
valida os dados. - Cria um novo registro na tabela
users
. - Lógica de Papel e Verificação:
- Se o Nº USP foi fornecido, o usuário recebe o papel
usp_user
e seu email é marcado como verificado (email_verified_at
preenchido). - Se o Nº USP NÃO foi fornecido, o usuário recebe o papel
external_user
e seu email NÃO é verificado (email_verified_at
permanece nulo), exigindo que o usuário passe pelo fluxo de verificação de email.
- Se o Nº USP foi fornecido, o usuário recebe o papel
- Redireciona para o dashboard admin com uma mensagem de sucesso.
- Uma senha segura é sugerida na view para facilitar a criação.
- Controller:
Extensibilidade
O sistema spatie/laravel-permission
é altamente extensível:
- Novos Papéis/Permissões: Podem ser criados programaticamente (ex: em Seeders ou Migrations) usando
Role::create(['name' => 'nome_papel'])
ePermission::create(['name' => 'nome_permissao'])
. Lembre-se de especificar oguard_name
correto (web
para sua aplicação). - Atribuição: Use os métodos fornecidos pelo trait
HasRoles
no modelUser
:$user->assignRole('nome_papel');
$user->givePermissionTo('nome_permissao');
$user->syncRoles(['papel1', 'papel2']);
$user->syncPermissions(['permissao1', 'permissao2']);
- Verificação: Use as diretivas Blade (
@role
,@hasrole
,@can
) ou os métodos no model ($user->hasRole('...')
,$user->can('...')
).
Consulte a documentação oficial do Spatie Laravel Permission para mais detalhes sobre funcionalidades avançadas.