Do not speak Portuguese? Translate this site with Google or Bing Translator
USER ROLES AND PERMISSIONS IN LARAVEL 6

Posted on: October 06, 2021 03:25 PM

Posted by: Renato

Categories: Laravel mysql

Views: 2670

ROLES E PERMISSÕES DO USUÁRIO NO LARAVEL 6

Comandos Utilizados:

- composer create-project --prefer-dist laravel/laravel laravel6role "6.0.*"

- composer require laravel/ui "^1.0" --dev

- php artisan ui:auth

php artisan make:migration create_roles_table
php artisan make:migration create_user_role_table
php artisan make:migration create_groups_table
php artisan make:migration create_user_group_table
php artisan make:migration create_permissions_table
php artisan make:migration create_role_permission_table
php artisan migrate
php artisan make:model Role
php artisan make:model Group
php artisan make:model Permission
php artisan make:controller UserController
php artisan make:controller RoleController

composer dumpautoload
php artisan serve

Normalmente, nos projetos que fazemos, existem associações entre usuários e funções(Roles), permissões, grupos. Normalmente fazemos isso para verificar os direitos de cada usuário, saber em que função ele está? Quais direitos? A que grupos você pertence?
Agora irei criar esses relacionamentos no Laravel 6, esse post também é bem longo, acabo de compartilhar como reconhecer e fazer, o resto cada um pode desenvolver mais de acordo com a sua vontade!

No diagrama acima, vemos que:
- O usuário tem muitas funções (Roles), ao mesmo tempo a função tem muitos usuários
- Uma função tem muitas permissões (permissões)
- O usuário pode pertencer a muitos grupos diferentes, um grupo tem muitos usuários
- Em um grupo, haverá uma certa função

I. Instale o Laravel

# composer create-project --prefer-dist laravel/laravel laravel6role "6.0.*"

II.Criar Migração no Laravel 6

- Usuários da tabela, impressão padrão do Laravel está disponível 
- Funções da tabela: # php artisan make: migration create_roles_table --create = roles

Schema::create('roles'function (Blueprint $table) {
    $table->bigIncrements('id');
    $table->string('name');
    $table->timestamps();
});

- Criar associação entre usuário e função: # php artisan make: migration create_user_role_table --create = user_role

Schema::create('user_role'function (Blueprint $table) {
    $table->bigIncrements('id');
    $table->unsignedBigInteger('user_id');
    $table->unsignedBigInteger('role_id');
    $table->foreign('user_id')->references('id')->on('users');
    $table->foreign('role_id')->references('id')->on('roles');
});

- Grupos de tabela: # php artisan make: migration create_groups_table --create = groups

Schema::create('groups'function (Blueprint $table) {
    $table->bigIncrements('id');
    $table->string('name');
    $table->unsignedBigInteger('role_id');
    $table->foreign('role_id')->references('id')->on('roles');
    $table->timestamps();
});

- Tabela liên kết giữa usuário và grupo: # php artisan make: migration create_user_group_table --create = user_group

Schema::create('user_group'function (Blueprint $table) {
    $table->bigIncrements('id');
    $table->unsignedBigInteger('user_id');
    $table->unsignedBigInteger('group_id');
    $table->foreign('user_id')->references('id')->on('users');
    $table->foreign('groud_id')->references('id')->on('groups');
});

- Permissões de tabela: # php artisan make: migration create_permissions_table --create = permissions

Schema::create('permissions'function (Blueprint $table) {
    $table->bigIncrements('id');
    $table->string('name');
    $table->timestamps();
});

- Criar associação entre função e permissão: # php artisan make: migration create_role_permission_table --create = role_permission

Schema::create('role_permission'function (Blueprint $table) {
    $table->bigIncrements('id');
    $table->unsignedBigInteger('role_id');
    $table->unsignedBigInteger('permission_id');
    $table->foreign('role_id')->references('id')->on('roles');
    $table->foreign('permission_id')->references('id')->on('permissions');
});

- Depois de criar, você precisa executar o comando para criar a tabela: php artisan migrate

III. Tạo Modelo de Relacionamento (Usuário, Função, Grupo, Permissão) 

- Precisamos iterar os relacionamentos-chave entre as tabelas da seguinte maneira:

* Model App \ User.php

public function roles(){
    return $this->belongsToMany(Role::class,'user_role');
}
 
public function groups(){
    return $this->belongsToMany(Group::class,'user_group');
}

* Model App \ Role.php 

public function users(){
    return $this->belongsToMany(User::class,'user_role');
}
public function permissions(){
    return $this->belongsToMany(Permission::class,'role_permission');
}
public function groups(){
    return $this->hasMany(Group::class);
}

* Model App \ Group.php 

public function users(){
    return $this->belongsToMany(User::class,'user_group');
}
public function role(){
    return $this->belongsTo(Role::class);
}

* Model App \ Permission.php

public function roles(){
    return $this->belongsToMany(Role::class,'role_permission');
}

IV.Tạo Auth no Laravel 

- Aqui, eu uso Auth no laravel para entrar e registrar por menos tempo
# php artisan make: Auth 
- Estou aproveitando o cara do Auth para criar layouts estruturados disponíveis, por Xiu mais barato apenas na Ásia, mas: :)
- Primeiro após o registro, vou mudar para casa, no roteador ('casa') quando vou mostrar os dados como este 

V. Crie um controlador no Laravel 

- Precisamos do Controller conforme abaixo, precisamos usar o Controller de qualquer modelo, basta criá-los.


HomeController.php (destinava-se a executar php artisan make: Auth )

public function index()
{
    $users = User::with('roles','groups')->get();
    $roles = Role::with('users','permissions')->get();
    return view('home')->with(array('users'=>$users,'roles'=>$roles));
}

- No código acima, eu chamo o link entre Usuário e Funções, Grupos para obter seus dados
- Então eu retorno View ('home') para mostrar os dados conforme mostrado acima

UserController.php

public function index()
{
    $users = User::all();
    $roles = Role::all();
    return View('add_roles_user')->with(array('users'=>$users,'roles'=>$roles));
}
public function store(Request $request)
{
     $role = Role::find($request->role_id);
     $role->users()->detach($request->users);
     $role->users()->attach($request->users);
     return redirect()->route('home');
}

- Em UserController.php, editei duas funções, function index () voltei para a interface add_role_user
- E armazenamento de função (Request $ request) : usado para receber dados do formulário enviado e processar mais dados, em também não considero quaisquer condições aqui, você pode considerar as condições mais tarde

+ RoleController.php

public function index()
{
    $roles = Role::all();
 
    $permissions = Permission::all();
    return View('add_roles')->with(array('roles'=>$roles,'permissions'=>$permissions));
}
public function store(Request $request)
    {
        
        $role_id $request->role_id;
        $role = Role::find($role_id);
        if(count($role)>0){
            $checkRole = Role::where('id',$role_id)->withCount('permissions')->get()->toArray();
            if($checkRole[0]['permissions_count']>0){
               $role->permissions()->detach();//delete all relationship in role_permission
            }
            $role->permissions()->attach($request->permissions);//add list permissions
            return redirect()->route('home');
             
        }
        return redirect()->route('home');
 
    }

- Em RoleController.php também existem 2 funções ( índice, armazenamento ): 
+ Primeiro eu recebo os dados do formulário, verifico se o role_id está nos dados
+ Se sim, continuo verificando os dados no relacionamento entre na tabela de (User & Role) -> essa é a tabela user_role nesse banco de dados, no laravel vem com um recurso que retorna o número de linhas de dados na tabela do relacionamento, com base no que processamos apenas.

Crie View Blade no Laravel 

Views / home.blade.php : abra este arquivo e edite-o da seguinte maneira:

@extends('layouts.app')
 
@section('content')
class="container">
    
class="row justify-content-center">
        
class="col-md-6">
            
class="card">
                
class="card-header">Roles
                
class="card-body">
                    class="table">
                        
                            
                                 Roles
                                 Permissions
                                 User
                            
                        
                        
                        @foreach($roles as $role)
                            
$role->name}}
                                 {{
                                  
                                    @if(count($role->permissions)>0)
                                        @foreach($role->permissions as $permission)
                                             class="badge badge-success">{{$permission->name}}
                                        @endforeach
                                    @else
                                        class="badge badge-danger">No permission
                                    @endif
                                
                                  
                                    
                                    @if(count($role->users)>0)
                                        @foreach($role->users as $user)
                                             
  • class="badge badge-success">{{$user->name}}
                                        @endforeach
                                    @else
                                        
  • class="badge badge-danger">No user
                                    @endif
                                    
                                
                            
                        @endforeach
                        
                    
                
            
        
        
class="col-md-6">
            
class="card">
                
class="card-header">Users
                
class="card-body">
                    class="table">
                        
                            
                                 Name
                                 Role
                                 Group
                                 Edit
Delete
                                  
                            
                        
                        
                            @foreach($users as $user)
                                 
                                
$user->name}}
                                     {{
                                      
                                        
                                    @if(count($user->roles)>0)
                                        @foreach($user->roles as $role)
                                            class="badge  badge-success">{{$role->name}}
                                        @endforeach
                                    @else
                                        class="badge badge-danger">No role
                                    @endif 
                                    
                                      
                                    @if(count($user->groups)>0)
                                        @foreach($user->groups as $group)
                                           class="badge  badge-primary">{{$group->name}}
                                        @endforeach
                                    @else
                                        class="badge badge-danger">No group
                                    @endif
                                    
                                     "" class="badge badge-warning">Edit
                                     "" class="badge badge-danger">Delete
                                
 
                            @endforeach
                        
                    
                
            
        
    
@endsection

- To file Views / add_roles_user.blade.php

@extends('layouts.app')
@section('content')
class="container">
"{{route('user.new')}}" method="post">
    
class="row justify-content-center">
        
class="col-md-6">
         @csrf
            
class="card">
                
class="card-header">Roles
                
class="card-body">
                  "role_id"class="form-control">
                    @foreach($roles as $role)
                        "{{$role->id}}">{{$role->name}}
                    @endforeach
                   
                
                
class="card-footer">"submit" class="btn btn-success" name="add_role" value="Add Roles"/>
            
        
        
class="col-md-6">
            
class="card">
                
class="card-header">Users
                
class="card-body">
                   
                    @foreach($users as $user)
                        
  • "checkbox" name="users[]" value="{{$user->id}}">{{$user->name}}
                    @endforeach
                   
                
            
        
    
@endsection

- Tạo Views / add_roles.blade.php 

@extends('layouts.app')
@section('content')
class="container">
"{{route('role.new')}}" method="post">
    
class="row justify-content-center">
        
class="col-md-6">
         @csrf
            
class="card">
                
class="card-header">Roles
                
class="card-body">
                  "role_id"class="form-control">
                    @foreach($roles as $role)
                        "{{$role->id}}">{{$role->name}}
                    @endforeach
                   
                
                
class="card-footer">"submit" class="btn btn-success" name="add_role" value="Add Roles"/>
            
        
        
class="col-md-6">
            
class="card">
                
class="card-header">Permissions
                
class="card-body">
                   
                    @foreach($permissions as $permission)
                        
  • "checkbox" name="permissions[]" value="{{$permission->id}}">{{$permission->name}}
                    @endforeach
                   
                
            
        
    
@endsection

- Em seguida, precisamos configurar o arquivo web.php , no diretório roteadores da seguinte maneira:

Route::resource('user','UserController',[
    'names'=>[
        'index'=>'user',
        'store'=>'user.new',
    ]
]);
Route::resource('role','RoleController',[
    'names' => [
        'index' => 'role',
        'store' => 'role.new',
     
    ]
]);

Este post tem muitas coisas que ficaram inacabadas! Acabei de descrever para que possamos visualizar a conexão entre Usuário e Funções e Permissões, somente Grupos.

- https://gitlab.com/cpdrenato/laravel6roles

- Fontes: https://hoanguyenit.com/user-roles-and-permissions-in-laravel-58.html


3

Share

Donate to Site


About Author

Renato

Developer

Add a Comment
Comments 0 Comments

No comments yet! Be the first to comment

Blog Search


Categories

OUTROS (15) Variados (109) PHP (130) Laravel (157) Black Hat (3) front-end (28) linux (113) postgresql (39) Docker (26) rest (5) soap (1) webservice (6) October (1) CMS (2) node (7) backend (13) ubuntu (54) devops (25) nodejs (5) npm (2) nvm (1) git (8) firefox (1) react (6) reactnative (5) collections (1) javascript (6) reactjs (7) yarn (0) adb (1) Solid (2) blade (3) models (1) controllers (0) log (1) html (2) hardware (3) aws (14) Transcribe (2) transcription (1) google (4) ibm (1) nuance (1) PHP Swoole (5) mysql (31) macox (4) flutter (1) symfony (1) cor (1) colors (2) homeOffice (2) jobs (3) imagick (2) ec2 (1) sw (1) websocket (1) markdown (1) ckeditor (1) tecnologia (14) faceapp (1) eloquent (14) query (4) sql (40) ddd (3) nginx (9) apache (4) certbot (1) lets-encrypt (3) debian (11) liquid (1) magento (2) ruby (1) LETSENCRYPT (1) Fibonacci (1) wine (1) transaction (1) pendrive (1) boot (1) usb (1) prf (1) policia (2) federal (1) lucena (1) mongodb (4) paypal (1) payment (1) zend (1) vim (4) ciencia (6) js (1) nosql (1) java (1) JasperReports (1) phpjasper (1) covid19 (1) saude (1) athena (1) cinnamon (1) phpunit (2) binaural (1) mysqli (3) database (42) windows (6) vala (1) json (2) oracle (1) mariadb (4) dev (12) webdev (24) s3 (4) storage (1) kitematic (1) gnome (2) web (2) intel (3) piada (1) cron (2) dba (18) lumen (1) ffmpeg (2) android (2) aplicativo (1) fedora (2) shell (4) bash (3) script (3) lider (1) htm (1) csv (1) dropbox (1) db (3) combustivel (2) haru (1) presenter (1) gasolina (1) MeioAmbiente (1) Grunt (1) biologia (1) programming (22) performance (3) brain (1) smartphones (1) telefonia (1) privacidade (1) opensource (3) microg (1) iode (1) ssh (3) zsh (2) terminal (3) dracula (1) spaceship (1) mac (2) idiomas (1) laptop (2) developer (37) api (4) data (1) matematica (1) seguranca (2) 100DaysOfCode (9) hotfix (1) documentation (1) laravelphp (10) RabbitMQ (1) Elasticsearch (1) redis (2) Raspberry (4) Padrao de design (4) JQuery (1) angularjs (4) Dicas (40) Kubernetes (2) vscode (2) backup (1) angular (3) servers (2) pipelines (1) AppSec (1) DevSecOps (4) rust (1) RustLang (1) Mozilla (1) algoritimo (1) sqlite (1) Passport (1) jwt (4) security (2) translate (1) kube (1) iot (1) politica (2) bolsonaro (1) flow (1) podcast (1) Brasil (1) containers (2) traefik (1) networking (1) host (1) POO (2) microservices (2) bug (1) cqrs (1) arquitetura (2) Architecture (3) sail (3) militar (1) artigo (1) economia (1) forcas armadas (1) ffaa (1) autenticacao (1) autorizacao (2) authentication (4) authorization (2) NoCookies (1) wsl (4) memcached (1) macos (2) unix (2) kali-linux (1) linux-tools (5) apple (1) noticias (2) composer (1) rancher (1) k8s (1) escopos (1) orm (1) jenkins (4) github (5) gitlab (3) queue (1) Passwordless (1) sonarqube (1) phpswoole (1) laraveloctane (1) Swoole (1) Swoole (1) octane (1) Structurizr (1) Diagramas (1) c4 (1) c4-models (1) compactar (1) compression (1) messaging (1) restfull (1) eventdrive (1) services (1) http (1) Monolith (1) microservice (1) historia (1) educacao (1) cavalotroia (1) OOD (0) odd (1) chatgpt (1) openai (3) vicuna (1) llama (1) gpt (1) transformers (1) pytorch (1) tensorflow (1) akitando (1) ia (1) nvidia (1) agi (1) guard (1) multiple_authen (2) rpi (1) auth (1) auth (1) livros (2) ElonMusk (2) Oh My Zsh (1) Manjaro (1) BigLinux (2) ArchLinux (1) Migration (1) Error (1) Monitor (1) Filament (1) LaravelFilament (1) replication (1) phpfpm (1) cache (1) vpn (1) l2tp (1) zorin-os (1) optimization (1) scheduling (1) monitoring (2) linkedin (1) community (1) inteligencia-artificial (2) wsl2 (1) maps (1) API_KEY_GOOGLE_MAPS (1) repmgr (1) altadisponibilidade (1) banco (1) modelagemdedados (1) inteligenciadedados (4) governancadedados (1) bancodedados (2) Observability (1) picpay (1) ecommerce (1) Curisidades (1) Samurai (1)

New Articles



Get Latest Updates by Email