Criar Sistema de Permissões
Introdução ao sistema de permissão
- aula do arquivo zip do professor até a última atualização do projeto e executando os comandos para carregar o projeto…
Como instalar Laravel Permission
- dependência laravel permission

-
https://spatie.be/docs/laravel-permission/v6/installation-laravel
-
instalar a dependência de permissão
composer require spatie/laravel-permission- criar migration abaixo (será criado 2 arquivos - config/permission.php e uma migration em database/migrations/arquivo_migration.php)
php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider"- limpar cache (segundo documentação do spatie laravel permission)
php artisan config:clear- executar as migrations
php artisan migrateSerá criado 5 tabelas
-
funções/roles - tabela que armazenará o nome de todas as funções (papéis (roles), níveis de acesso) da aplicação.
-
permissões/permissions - tabela que armazenará o nome de todas as permissões da aplicação.
-
role_has_permissions - tabela que armazenará todas as permissões atribuídas a cada função.
-
model_has_roles - tabela que armazenará funções atribuídas a cada modelo.
-
model_has_permissions - tabela que armazenará as permissões atribuídas a cada modelo. Por exemplo, um modelo de usuário.
-
adicionar comando abaixo na model Usuario

use HasRoles;
Criar seed para papel e permissão
- criar seed de permissão
php artisan make:seeder PermissionSeeder-
para o projeto, utilizaremos o nome da rota como nome da permissão (permissão por página)
-
configurar arquivo PermissionSeeder.php

-
acrescentar seed no arquivo DatabaseSeeder.php
-
antes de executar o seed abaixo, truncate na tabela usuarios e comentar a seeder UsuarioSeeder, pois cada Usuário precisa ter um nível de acesso (será configurado logo a frente)

- executar seed
php artisan db:seed- criar seed papel
php artisan make:seeder RoleSeeder- configurar arquivo RoleSeeder.php

- acrescentar seed no arquivo DatabaseSeeder.php

- executar seed
php artisan db:seed-
após a configuração do arquivo RoleSeeder.php, necessário atribuir os níveis de acesso (papel) para cada usuário no arquivo UserSeeder.php (cada usuário terá um tipo de nível de acesso)
-
obs: mesmo nome do nível de acesso definido no arquivo RoleSeeder.php (‘Super Admin’, ‘Admin’ etc…)

-
como foi necessário configurar o nível de acesso para cada usuário, a tabela users foi apagada para gerar nova tabela com os níveis de acesso definidos na tabela
-
após executar o comando ‘php artisan db:seed’, será cadastrado o nível de usuário para cada usuário da tabela users na tabela model_has_roles

- com os níveis de acesso definidos para cada usuário, agora é necessário restringir os acessos por página
Bloquear o acesso a página sem permissão de acesso
- acrescentar informações para validar a permissão no arquivo LoginController.php. Se o nível de acesso for ‘Super Admin’, liberado acesso para todas as páginas, se for qualquer outro nível de acesso, será carregado as permissões conforme cadastradas no banco de dados

- utilizar middleware de permissão (arquivo Kernel.php) no atributo middlewareAliases

- na controller CourseController.php, criar um método construtor que irá validar se usuário logado tem permissão para acessar as páginas

- agora, ao tentar acessar página sem permissão, será apresentado mensagem de erro

- para o super admin, é possível apresentar erros. Seguir documentação conforme abaixo


Ocultar botão da página sem permissão de acesso

-
necessário editar nas views, de acordo com o nome da permissão (coluna ‘name’ da tabela permissions)
-
se o usuário tiver permissão, será exibido o elemento na página. Se não tiver permissão, o elemento não será exibido

Cadastrar e editar o papel do usuário
- método para trazer o nome do nível de acesso do usuário

- atribur nível de acesso aluno quando o usuário se cadastrar no sistema (LoginController.php)


- listar opções de nível de acesso ao cadastrar usuário quando estiver logado no sistema (UserController.php - método create)

-
carregar as opções de nível de acesso na view de cadastro usuário (views/users/create.blade.php)
-
obs: exibir ‘Super Admin’ nas opções do select apenas se o usuário logado for ‘Super Admin’. Somente o super admin poderá cadastrar um outro usuário como Super Admin

- incluir o nível de acesso nas validações do backend (UserRequest.php)

- incluir o nível de acesso no método store (cadastrar usuário)

- carregar os papeis no método edit para serem enviados como array para a view editar usuário (edit)

- na view editar usuário, carregar o select pré selecionado com as informações do usuário selecionado e carregar as opções de nível de acesso cadastrados no banco, caso o usuário queira editar

- acrescentar no método update (UserController.php) para salvar edição de nível de acesso no banco de dados

-
quando apagar um usuário, necessário remover todos os níveis de acesso atribuídos ao usuário que foi apagado
-
acrescentado no log id do usuário logado que está executando uma ação de delete. Por ex: usuário 2 apagou usuário 8…

Listar os papéis
-
criar as rotas dos níveis de acesso
-
criar a controller RoleController.php
php artisan make:controller RoleController- controller recebe os dados do banco e envia para a view

-
criar a view index roles (cópia da view index da pasta courses)
-
acrescentar o menu ‘Níveis de Acesso’ na sidebar - arquivo layouts/admin.blade.php

- criar o método construtor na controller RoleController.php para bloquear acesso a página caso usuário não tenha permissão

- cadastrar permissão através dos seeders (PermissionSeeder.php)

- executar a seed
php artisan db:seedListar as permissões do papel
-
criar a rota no arquivo web.php
(index-role-permission/{role}) -
criar a controller RolePermissionController e o método index
php artisan make:controller RolePermissionController- incluir na view roles/index.blade.php o href correto de cada nível de acesso


-
caso o nível de acesso seja super admin, não permitir visualizar as permissões (método index da PermissoesNivelAcessoController)
-
pluck: método utilizado para recuperar lista de valores de 1 única coluna do banco de dados
-
criar a view (views/rolesPermissions/index.blade.php)
-
validar na view rolesPermissions/index.blade.php quais são as permissões que estão liberadas e bloqueadas, de acordo com o nível de acesso selecionado
-
ex:


- carregar apenas as permissões do id do nível de acesso selecionado

-
dica do professor: criar uma coluna na tabela permissions com o nome ‘título’, para facilitar o entendimento das permissões liberadas/bloqueadas
-
OBS: dica não seguida para o projeto atual, pois estou usando o nome das rotas em pt-br e consequentemente o nome das permissões segue o nome das rotas
-
criar a migration
php artisan make:migration alter_permissions_table
- executar a migration
php artisan migrate- com a coluna criada, necessário editar seeder que cadastra as permissões (PermissionSeeder.php)

-
como a tabela já existe, ao tentar executar ‘php artisan db:seed’ não será cadastrado o título das permissões. Necessário apagar o banco de dados
-
com o banco de dados apagado, executar ‘php artisan migrate’ para criar as tabelas e depois ‘php artisan db:seed’ para popular os seeders na tabela
-
agora, na view listar permissões (rolesPermissions/index.blade.php), exibir o título da permissão

Alterar a permissão de acesso ao papel
-
criar a rota
(update-role-permission/{role}/{permission}) -
criar o método update

- criar um link na view rolesPermissions/index.blade.php referenciando a rota do update

-
acrescentar a validação das páginas, para exibir a página de permissão do nível de acesso apenas se o usuário tiver as permissões
-
seeder PermissionSeeder.php

- controller RolePermissionController.php
