Pular para o conteúdo

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

alt text

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 migrate

Será 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

alt text

use HasRoles;

alt text

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

alt text

  • 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)

alt text

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

alt text

  • acrescentar seed no arquivo DatabaseSeeder.php

alt text

  • 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…)

alt text

  • 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

alt text

  • 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

alt text

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

alt text

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

alt text

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

alt text

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

alt text

alt text

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

alt text

  • 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

alt text

Cadastrar e editar o papel do usuário

  • método para trazer o nome do nível de acesso do usuário

alt text

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

alt text

alt text

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

alt text

  • 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

alt text

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

alt text

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

alt text

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

alt text

  • 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

alt text

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

alt text

  • 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…

alt text

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

alt text

  • 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

alt text

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

alt text

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

alt text

  • executar a seed
php artisan db:seed

Listar 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

alt text

alt text

  • 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:

alt text

alt text

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

alt text

  • 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

alt text

  • executar a migration
php artisan migrate
  • com a coluna criada, necessário editar seeder que cadastra as permissões (PermissionSeeder.php)

alt text

  • 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

alt text

Alterar a permissão de acesso ao papel

  • criar a rota (update-role-permission/{role}/{permission})

  • criar o método update

alt text

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

alt text

  • 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

alt text

  • controller RolePermissionController.php

alt text