Logo

Arcocia Tech Unipessoal LDA is Loading ...

User Role and Permission System in Laravel - Spatie Permission

User Role and Permission System in Laravel - Spatie Permission

[PDOException] SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes

public function boot() { Schema::defaultStringLength(191); }

class User extends Authenticatable { use HasRoles;

// ...

}

$role = Role::create(['name' => 'writer']); $permission = Permission::create(['name' => 'edit articles']);

@hasrole('writer') I'm a writer! @else I'm not a writer... @endhasrole

@hasanyrole(Role::all()) I have one or more of these roles! @else I have none of these roles... @endhasanyrole

@hasallroles(Role::all()) I have all of these roles! @else I don't have all of these roles... @endhasallroles

<!-- CSRF Token -->
<meta name="csrf-token" content="{{ csrf_token() }}">

<title>{{ config('app.name', 'Laravel') }}</title>

<!-- Styles -->
<link href="{{ asset('css/app.css') }}" rel="stylesheet">

<link href="{{ asset('css/styles.css') }}" rel="stylesheet">

<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">

<!-- Scripts -->
<script>
    window.Laravel = {!! json_encode([
        'csrfToken' => csrf_token(),
    ]) !!};
</script>
<script src="https://use.fontawesome.com/9712be8772.js"></script>

</head> <body> <div id="app"> <nav class="navbar navbar-default navbar-static-top"> <div class="container"> <div class="navbar-header">

                &lt;!-- Collapsed Hamburger --&gt;
                &lt;button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#app-navbar-collapse"&gt;
                    &lt;span class="sr-only"&gt;Toggle Navigation&lt;/span&gt;
                    &lt;span class="icon-bar"&gt;&lt;/span&gt;
                    &lt;span class="icon-bar"&gt;&lt;/span&gt;
                    &lt;span class="icon-bar"&gt;&lt;/span&gt;
                &lt;/button&gt;

                &lt;!-- Branding Image --&gt;
                &lt;a class="navbar-brand" href="{{ url('/') }}"&gt;
                    {{ config('app.name', 'Laravel') }}
                &lt;/a&gt;
            &lt;/div&gt;

            &lt;div class="collapse navbar-collapse" id="app-navbar-collapse"&gt;
                &lt;!-- Left Side Of Navbar --&gt;
                &lt;ul class="nav navbar-nav"&gt;
                    &lt;li&gt;&lt;a href="{{ url('/') }}"&gt;Home&lt;/a&gt;&lt;/li&gt;
                    @if (!Auth::guest())
                        &lt;li&gt;&lt;a href="{{ route('posts.create') }}"&gt;New Article&lt;/a&gt;&lt;/li&gt;
                     @endif
                &lt;/ul&gt;

                &lt;!-- Right Side Of Navbar --&gt;
                &lt;ul class="nav navbar-nav navbar-right"&gt;
                    &lt;!-- Authentication Links --&gt;
                    @if (Auth::guest())
                        &lt;li&gt;&lt;a href="{{ route('login') }}"&gt;Login&lt;/a&gt;&lt;/li&gt;
                        &lt;li&gt;&lt;a href="{{ route('register') }}"&gt;Register&lt;/a&gt;&lt;/li&gt;
                    @else
                        &lt;li class="dropdown"&gt;
                            &lt;a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false"&gt;
                                {{ Auth::user()-&gt;name }} &lt;span class="caret"&gt;&lt;/span&gt;
                            &lt;/a&gt;

                            &lt;ul class="dropdown-menu" role="menu"&gt;
                                &lt;li&gt;
                                    @role('Admin') {{-- Laravel-permission blade helper --}}
                                    &lt;a href="#"&gt;&lt;i class="fa fa-btn fa-unlock"&gt;&lt;/i&gt;Admin&lt;/a&gt;
                                    @endrole
                                    &lt;a href="{{ route('logout') }}"
                                        onclick="event.preventDefault();
                                                 document.getElementById('logout-form').submit();"&gt;
                                        Logout
                                    &lt;/a&gt;

                                    &lt;form id="logout-form" action="{{ route('logout') }}" method="POST" style="display: none;"&gt;
                                        {{ csrf_field() }}
                                    &lt;/form&gt;
                                &lt;/li&gt;
                            &lt;/ul&gt;
                        &lt;/li&gt;
                    @endif
                &lt;/ul&gt;
            &lt;/div&gt;
        &lt;/div&gt;
    &lt;/nav&gt;

    @if(Session::has('flash_message'))
        &lt;div class="container"&gt;      
            &lt;div class="alert alert-success"&gt;&lt;em&gt; {!! session('flash_message') !!}&lt;/em&gt;
            &lt;/div&gt;
        &lt;/div&gt;
    @endif 

    &lt;div class="row"&gt;
        &lt;div class="col-md-8 col-md-offset-2"&gt;              
            @include ('errors.list') {{-- Including error file --}}
        &lt;/div&gt;
    &lt;/div&gt;

    @yield('content')

&lt;/div&gt;

&lt;!-- Scripts --&gt;
&lt;script src="{{ asset('js/app.js') }}"&gt;&lt;/script&gt;

</body> </html>

use Illuminate\Support\Facades\Schema; use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration;

class CreatePostsTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('posts', function (Blueprint $table) { $table->increments('id'); $table->string('title'); $table->text('body'); $table->timestamps(); }); }

/**
 * Reverse the migrations.
 *
 * @return void
 */
public function down()
{
    Schema::dropIfExists('posts');
}

}

class Post extends Model { protected $fillable = [ 'title', 'body' ]; }

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\Post; use Auth; use Session;

class PostController extends Controller {

public function __construct() {
    $this-&gt;middleware(['auth', 'clearance'])-&gt;except('index', 'show');
}

/**
 * Display a listing of the resource.
 *
 * @return \Illuminate\Http\Response
 */


public function index() {
    $posts = Post::orderby('id', 'desc')-&gt;paginate(5); //show only 5 items at a time in descending order

    return view('posts.index', compact('posts'));
}

/**
 * Show the form for creating a new resource.
 *
 * @return \Illuminate\Http\Response
 */
public function create() {
    return view('posts.create');
}

/**
 * Store a newly created resource in storage.
 *
 * @param  \Illuminate\Http\Request  $request
 * @return \Illuminate\Http\Response
 */
public function store(Request $request) { 

//Validating title and body field
    $this-&gt;validate($request, [
        'title'=&gt;'required|max:100',
        'body' =&gt;'required',
        ]);

    $title = $request['title'];
    $body = $request['body'];

    $post = Post::create($request-&gt;only('title', 'body'));

//Display a successful message upon save
    return redirect()-&gt;route('posts.index')
        -&gt;with('flash_message', 'Article,
         '. $post-&gt;title.' created');
}

/**
 * Display the specified resource.
 *
 * @param  int  $id
 * @return \Illuminate\Http\Response
 */
public function show($id) {
    $post = Post::findOrFail($id); //Find post of id = $id

    return view ('posts.show', compact('post'));
}

/**
 * Show the form for editing the specified resource.
 *
 * @param  int  $id
 * @return \Illuminate\Http\Response
 */
public function edit($id) {
    $post = Post::findOrFail($id);

    return view('posts.edit', compact('post'));
}

/**
 * Update the specified resource in storage.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  int  $id
 * @return \Illuminate\Http\Response
 */
public function update(Request $request, $id) {
    $this-&gt;validate($request, [
        'title'=&gt;'required|max:100',
        'body'=&gt;'required',
    ]);

    $post = Post::findOrFail($id);
    $post-&gt;title = $request-&gt;input('title');
    $post-&gt;body = $request-&gt;input('body');
    $post-&gt;save();

    return redirect()-&gt;route('posts.show', 
        $post-&gt;id)-&gt;with('flash_message', 
        'Article, '. $post-&gt;title.' updated');

}

/**
 * Remove the specified resource from storage.
 *
 * @param  int  $id
 * @return \Illuminate\Http\Response
 */
public function destroy($id) {
    $post = Post::findOrFail($id);
    $post-&gt;delete();

    return redirect()-&gt;route('posts.index')
        -&gt;with('flash_message',
         'Article successfully deleted');

}

}

Route::get('/', function () { return view('welcome'); });

Auth::routes();

Route::get('/', 'PostController@index')->name('home');

Route::resource('users', 'UserController');

Route::resource('roles', 'RoleController');

Route::resource('permissions', 'PermissionController');

Route::resource('posts', 'PostController');

@section('title', '| Create New Post')

@section('content') <div class="row"> <div class="col-md-8 col-md-offset-2">

    &lt;h1&gt;Create New Post&lt;/h1&gt;
    &lt;hr&gt;

{{-- Using the Laravel HTML Form Collective to create our form --}}
    {{ Form::open(array('route' =&gt; 'posts.store')) }}

    &lt;div class="form-group"&gt;
        {{ Form::label('title', 'Title') }}
        {{ Form::text('title', null, array('class' =&gt; 'form-control')) }}
        &lt;br&gt;

        {{ Form::label('body', 'Post Body') }}
        {{ Form::textarea('body', null, array('class' =&gt; 'form-control')) }}
        &lt;br&gt;

        {{ Form::submit('Create Post', array('class' =&gt; 'btn btn-success btn-lg btn-block')) }}
        {{ Form::close() }}
    &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

@endsection

@section('title', '| View Post')

@section('content')

<div class="container">

&lt;h1&gt;{{ $post-&gt;title }}&lt;/h1&gt;
&lt;hr&gt;
&lt;p class="lead"&gt;{{ $post-&gt;body }} &lt;/p&gt;
&lt;hr&gt;
{!! Form::open(['method' =&gt; 'DELETE', 'route' =&gt; ['posts.destroy', $post-&gt;id] ]) !!}
&lt;a href="{{ url()-&gt;previous() }}" class="btn btn-primary"&gt;Back&lt;/a&gt;
@can('Edit Post')
&lt;a href="{{ route('posts.edit', $post-&gt;id) }}" class="btn btn-info" role="button"&gt;Edit&lt;/a&gt;
@endcan
@can('Delete Post')
{!! Form::submit('Delete', ['class' =&gt; 'btn btn-danger']) !!}
@endcan
{!! Form::close() !!}

</div>

@endsection

@section('title', '| Edit Post')

@section('content') <div class="row">

&lt;div class="col-md-8 col-md-offset-2"&gt;

    &lt;h1&gt;Edit Post&lt;/h1&gt;
    &lt;hr&gt;
        {{ Form::model($post, array('route' =&gt; array('posts.update', $post-&gt;id), 'method' =&gt; 'PUT')) }}
        &lt;div class="form-group"&gt;
        {{ Form::label('title', 'Title') }}
        {{ Form::text('title', null, array('class' =&gt; 'form-control')) }}&lt;br&gt;

        {{ Form::label('body', 'Post Body') }}
        {{ Form::textarea('body', null, array('class' =&gt; 'form-control')) }}&lt;br&gt;

        {{ Form::submit('Save', array('class' =&gt; 'btn btn-primary')) }}

        {{ Form::close() }}
&lt;/div&gt;
&lt;/div&gt;

</div>

@endsection

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\User; use Auth;

//Importing laravel-permission models use Spatie\Permission\Models\Role; use Spatie\Permission\Models\Permission;

//Enables us to output flash messaging use Session;

class UserController extends Controller {

public function __construct() {
    $this-&gt;middleware(['auth', 'isAdmin']); //isAdmin middleware lets only users with a //specific permission permission to access these resources
}

/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index() {
//Get all users and pass it to the view
    $users = User::all(); 
    return view('users.index')-&gt;with('users', $users);
}

/**
* Show the form for creating a new resource.
*
* @return \Illuminate\Http\Response
*/
public function create() {
//Get all roles and pass it to the view
    $roles = Role::get();
    return view('users.create', ['roles'=&gt;$roles]);
}

/**
* Store a newly created resource in storage.
*
* @param  \Illuminate\Http\Request  $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request) {
//Validate name, email and password fields
    $this-&gt;validate($request, [
        'name'=&gt;'required|max:120',
        'email'=&gt;'required|email|unique:users',
        'password'=&gt;'required|min:6|confirmed'
    ]);

    $user = User::create($request-&gt;only('email', 'name', 'password')); //Retrieving only the email and password data

    $roles = $request['roles']; //Retrieving the roles field
//Checking if a role was selected
    if (isset($roles)) {

        foreach ($roles as $role) {
        $role_r = Role::where('id', '=', $role)-&gt;firstOrFail();            
        $user-&gt;assignRole($role_r); //Assigning role to user
        }
    }        
//Redirect to the users.index view and display message
    return redirect()-&gt;route('users.index')
        -&gt;with('flash_message',
         'User successfully added.');
}

/**
* Display the specified resource.
*
* @param  int  $id
* @return \Illuminate\Http\Response
*/
public function show($id) {
    return redirect('users'); 
}

/**
* Show the form for editing the specified resource.
*
* @param  int  $id
* @return \Illuminate\Http\Response
*/
public function edit($id) {
    $user = User::findOrFail($id); //Get user with specified id
    $roles = Role::get(); //Get all roles

    return view('users.edit', compact('user', 'roles')); //pass user and roles data to view

}

/**
* Update the specified resource in storage.
*
* @param  \Illuminate\Http\Request  $request
* @param  int  $id
* @return \Illuminate\Http\Response
*/
public function update(Request $request, $id) {
    $user = User::findOrFail($id); //Get role specified by id

//Validate name, email and password fields    
    $this-&gt;validate($request, [
        'name'=&gt;'required|max:120',
        'email'=&gt;'required|email|unique:users,email,'.$id,
        'password'=&gt;'required|min:6|confirmed'
    ]);
    $input = $request-&gt;only(['name', 'email', 'password']); //Retreive the name, email and password fields
    $roles = $request['roles']; //Retreive all roles
    $user-&gt;fill($input)-&gt;save();

    if (isset($roles)) {        
        $user-&gt;roles()-&gt;sync($roles);  //If one or more role is selected associate user to roles          
    }        
    else {
        $user-&gt;roles()-&gt;detach(); //If no role is selected remove exisiting role associated to a user
    }
    return redirect()-&gt;route('users.index')
        -&gt;with('flash_message',
         'User successfully edited.');
}

/**
* Remove the specified resource from storage.
*
* @param  int  $id
* @return \Illuminate\Http\Response
*/
public function destroy($id) {
//Find a user with a given id and delete
    $user = User::findOrFail($id); 
    $user-&gt;delete();

    return redirect()-&gt;route('users.index')
        -&gt;with('flash_message',
         'User successfully deleted.');
}

}

@section('title', '| Users')

@section('content')

<div class="col-lg-10 col-lg-offset-1"> <h1><i class="fa fa-users"></i> User Administration <a href="{{ route('roles.index') }}" class="btn btn-default pull-right">Roles</a> <a href="{{ route('permissions.index') }}" class="btn btn-default pull-right">Permissions</a></h1> <hr> <div class="table-responsive"> <table class="table table-bordered table-striped">

        &lt;thead&gt;
            &lt;tr&gt;
                &lt;th&gt;Name&lt;/th&gt;
                &lt;th&gt;Email&lt;/th&gt;
                &lt;th&gt;Date/Time Added&lt;/th&gt;
                &lt;th&gt;User Roles&lt;/th&gt;
                &lt;th&gt;Operations&lt;/th&gt;
            &lt;/tr&gt;
        &lt;/thead&gt;

        &lt;tbody&gt;
            @foreach ($users as $user)
            &lt;tr&gt;

                &lt;td&gt;{{ $user-&gt;name }}&lt;/td&gt;
                &lt;td&gt;{{ $user-&gt;email }}&lt;/td&gt;
                &lt;td&gt;{{ $user-&gt;created_at-&gt;format('F d, Y h:ia') }}&lt;/td&gt;
                &lt;td&gt;{{  $user-&gt;roles()-&gt;pluck('name')-&gt;implode(' ') }}&lt;/td&gt;{{-- Retrieve array of roles associated to a user and convert to string --}}
                &lt;td&gt;
                &lt;a href="{{ route('users.edit', $user-&gt;id) }}" class="btn btn-info pull-left" style="margin-right: 3px;"&gt;Edit&lt;/a&gt;

                {!! Form::open(['method' =&gt; 'DELETE', 'route' =&gt; ['users.destroy', $user-&gt;id] ]) !!}
                {!! Form::submit('Delete', ['class' =&gt; 'btn btn-danger']) !!}
                {!! Form::close() !!}

                &lt;/td&gt;
            &lt;/tr&gt;
            @endforeach
        &lt;/tbody&gt;

    &lt;/table&gt;
&lt;/div&gt;

&lt;a href="{{ route('users.create') }}" class="btn btn-success"&gt;Add User&lt;/a&gt;

</div>

@endsection

@section('title', '| Add User')

@section('content')

<div class='col-lg-4 col-lg-offset-4'>

&lt;h1&gt;&lt;i class='fa fa-user-plus'&gt;&lt;/i&gt; Add User&lt;/h1&gt;
&lt;hr&gt;

{{ Form::open(array('url' =&gt; 'users')) }}

&lt;div class="form-group"&gt;
    {{ Form::label('name', 'Name') }}
    {{ Form::text('name', '', array('class' =&gt; 'form-control')) }}
&lt;/div&gt;

&lt;div class="form-group"&gt;
    {{ Form::label('email', 'Email') }}
    {{ Form::email('email', '', array('class' =&gt; 'form-control')) }}
&lt;/div&gt;

&lt;div class='form-group'&gt;
    @foreach ($roles as $role)
        {{ Form::checkbox('roles[]',  $role-&gt;id ) }}
        {{ Form::label($role-&gt;name, ucfirst($role-&gt;name)) }}&lt;br&gt;

    @endforeach
&lt;/div&gt;

&lt;div class="form-group"&gt;
    {{ Form::label('password', 'Password') }}&lt;br&gt;
    {{ Form::password('password', array('class' =&gt; 'form-control')) }}

&lt;/div&gt;

&lt;div class="form-group"&gt;
    {{ Form::label('password', 'Confirm Password') }}&lt;br&gt;
    {{ Form::password('password_confirmation', array('class' =&gt; 'form-control')) }}

&lt;/div&gt;

{{ Form::submit('Add', array('class' =&gt; 'btn btn-primary')) }}

{{ Form::close() }}

</div>

@endsection

@extends('layouts.app')

@section('title', '| Edit User')

@section('content')

<div class='col-lg-4 col-lg-offset-4'>

&lt;h1&gt;&lt;i class='fa fa-user-plus'&gt;&lt;/i&gt; Edit {{$user-&gt;name}}&lt;/h1&gt;
&lt;hr&gt;

{{ Form::model($user, array('route' =&gt; array('users.update', $user-&gt;id), 'method' =&gt; 'PUT')) }}{{-- Form model binding to automatically populate our fields with user data --}}

&lt;div class="form-group"&gt;
    {{ Form::label('name', 'Name') }}
    {{ Form::text('name', null, array('class' =&gt; 'form-control')) }}
&lt;/div&gt;

&lt;div class="form-group"&gt;
    {{ Form::label('email', 'Email') }}
    {{ Form::email('email', null, array('class' =&gt; 'form-control')) }}
&lt;/div&gt;

&lt;h5&gt;&lt;b&gt;Give Role&lt;/b&gt;&lt;/h5&gt;

&lt;div class='form-group'&gt;
    @foreach ($roles as $role)
        {{ Form::checkbox('roles[]',  $role-&gt;id, $user-&gt;roles ) }}
        {{ Form::label($role-&gt;name, ucfirst($role-&gt;name)) }}&lt;br&gt;

    @endforeach
&lt;/div&gt;

&lt;div class="form-group"&gt;
    {{ Form::label('password', 'Password') }}&lt;br&gt;
    {{ Form::password('password', array('class' =&gt; 'form-control')) }}

&lt;/div&gt;

&lt;div class="form-group"&gt;
    {{ Form::label('password', 'Confirm Password') }}&lt;br&gt;
    {{ Form::password('password_confirmation', array('class' =&gt; 'form-control')) }}

&lt;/div&gt;

{{ Form::submit('Add', array('class' =&gt; 'btn btn-primary')) }}

{{ Form::close() }}

</div>

@endsection

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use Auth;

//Importing laravel-permission models use Spatie\Permission\Models\Role; use Spatie\Permission\Models\Permission;

use Session;

class PermissionController extends Controller {

public function __construct() {
    $this-&gt;middleware(['auth', 'isAdmin']); //isAdmin middleware lets only users with a //specific permission permission to access these resources
}

/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index() {
    $permissions = Permission::all(); //Get all permissions

    return view('permissions.index')-&gt;with('permissions', $permissions);
}

/**
* Show the form for creating a new resource.
*
* @return \Illuminate\Http\Response
*/
public function create() {
    $roles = Role::get(); //Get all roles

    return view('permissions.create')-&gt;with('roles', $roles);
}

/**
* Store a newly created resource in storage.
*
* @param  \Illuminate\Http\Request  $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request) {
    $this-&gt;validate($request, [
        'name'=&gt;'required|max:40',
    ]);

    $name = $request['name'];
    $permission = new Permission();
    $permission-&gt;name = $name;

    $roles = $request['roles'];

    $permission-&gt;save();

    if (!empty($request['roles'])) { //If one or more role is selected
        foreach ($roles as $role) {
            $r = Role::where('id', '=', $role)-&gt;firstOrFail(); //Match input role to db record

            $permission = Permission::where('name', '=', $name)-&gt;first(); //Match input //permission to db record
            $r-&gt;givePermissionTo($permission);
        }
    }

    return redirect()-&gt;route('permissions.index')
        -&gt;with('flash_message',
         'Permission'. $permission-&gt;name.' added!');

}

/**
* Display the specified resource.
*
* @param  int  $id
* @return \Illuminate\Http\Response
*/
public function show($id) {
    return redirect('permissions');
}

/**
* Show the form for editing the specified resource.
*
* @param  int  $id
* @return \Illuminate\Http\Response
*/
public function edit($id) {
    $permission = Permission::findOrFail($id);

    return view('permissions.edit', compact('permission'));
}

/**
* Update the specified resource in storage.
*
* @param  \Illuminate\Http\Request  $request
* @param  int  $id
* @return \Illuminate\Http\Response
*/
public function update(Request $request, $id) {
    $permission = Permission::findOrFail($id);
    $this-&gt;validate($request, [
        'name'=&gt;'required|max:40',
    ]);
    $input = $request-&gt;all();
    $permission-&gt;fill($input)-&gt;save();

    return redirect()-&gt;route('permissions.index')
        -&gt;with('flash_message',
         'Permission'. $permission-&gt;name.' updated!');

}

/**
* Remove the specified resource from storage.
*
* @param  int  $id
* @return \Illuminate\Http\Response
*/
public function destroy($id) {
    $permission = Permission::findOrFail($id);

//Make it impossible to delete this specific permission    
if ($permission-&gt;name == "Administer roles &amp; permissions") {
        return redirect()-&gt;route('permissions.index')
        -&gt;with('flash_message',
         'Cannot delete this Permission!');
    }

    $permission-&gt;delete();

    return redirect()-&gt;route('permissions.index')
        -&gt;with('flash_message',
         'Permission deleted!');

}

}

@section('title', '| Permissions')

@section('content')

<div class="col-lg-10 col-lg-offset-1"> <h1><i class="fa fa-key"></i>Available Permissions

&lt;a href="{{ route('users.index') }}" class="btn btn-default pull-right"&gt;Users&lt;/a&gt;
&lt;a href="{{ route('roles.index') }}" class="btn btn-default pull-right"&gt;Roles&lt;/a&gt;&lt;/h1&gt;
&lt;hr&gt;
&lt;div class="table-responsive"&gt;
    &lt;table class="table table-bordered table-striped"&gt;

        &lt;thead&gt;
            &lt;tr&gt;
                &lt;th&gt;Permissions&lt;/th&gt;
                &lt;th&gt;Operation&lt;/th&gt;
            &lt;/tr&gt;
        &lt;/thead&gt;
        &lt;tbody&gt;
            @foreach ($permissions as $permission)
            &lt;tr&gt;
                &lt;td&gt;{{ $permission-&gt;name }}&lt;/td&gt; 
                &lt;td&gt;
                &lt;a href="{{ URL::to('permissions/'.$permission-&gt;id.'/edit') }}" class="btn btn-info pull-left" style="margin-right: 3px;"&gt;Edit&lt;/a&gt;

                {!! Form::open(['method' =&gt; 'DELETE', 'route' =&gt; ['permissions.destroy', $permission-&gt;id] ]) !!}
                {!! Form::submit('Delete', ['class' =&gt; 'btn btn-danger']) !!}
                {!! Form::close() !!}

                &lt;/td&gt;
            &lt;/tr&gt;
            @endforeach
        &lt;/tbody&gt;
    &lt;/table&gt;
&lt;/div&gt;

&lt;a href="{{ URL::to('permissions/create') }}" class="btn btn-success"&gt;Add Permission&lt;/a&gt;

</div>

@endsection

@section('title', '| Create Permission')

@section('content')

<div class='col-lg-4 col-lg-offset-4'>

&lt;h1&gt;&lt;i class='fa fa-key'&gt;&lt;/i&gt; Add Permission&lt;/h1&gt;
&lt;br&gt;

{{ Form::open(array('url' =&gt; 'permissions')) }}

&lt;div class="form-group"&gt;
    {{ Form::label('name', 'Name') }}
    {{ Form::text('name', '', array('class' =&gt; 'form-control')) }}
&lt;/div&gt;&lt;br&gt;
@if(!$roles-&gt;isEmpty()) //If no roles exist yet
    &lt;h4&gt;Assign Permission to Roles&lt;/h4&gt;

    @foreach ($roles as $role) 
        {{ Form::checkbox('roles[]',  $role-&gt;id ) }}
        {{ Form::label($role-&gt;name, ucfirst($role-&gt;name)) }}&lt;br&gt;

    @endforeach
@endif
&lt;br&gt;
{{ Form::submit('Add', array('class' =&gt; 'btn btn-primary')) }}

{{ Form::close() }}

</div>

@endsection

@section('title', '| Edit Permission')

@section('content')

<div class='col-lg-4 col-lg-offset-4'>

&lt;h1&gt;&lt;i class='fa fa-key'&gt;&lt;/i&gt; Edit {{$permission-&gt;name}}&lt;/h1&gt;
&lt;br&gt;
{{ Form::model($permission, array('route' =&gt; array('permissions.update', $permission-&gt;id), 'method' =&gt; 'PUT')) }}{{-- Form model binding to automatically populate our fields with permission data --}}

&lt;div class="form-group"&gt;
    {{ Form::label('name', 'Permission Name') }}
    {{ Form::text('name', null, array('class' =&gt; 'form-control')) }}
&lt;/div&gt;
&lt;br&gt;
{{ Form::submit('Edit', array('class' =&gt; 'btn btn-primary')) }}

{{ Form::close() }}

</div>

@endsection

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use Auth; //Importing laravel-permission models use Spatie\Permission\Models\Role; use Spatie\Permission\Models\Permission;

use Session;

class RoleController extends Controller {

public function __construct() {
    $this-&gt;middleware(['auth', 'isAdmin']);//isAdmin middleware lets only users with a //specific permission permission to access these resources
}

/**
 * Display a listing of the resource.
 *
 * @return \Illuminate\Http\Response
 */
public function index() {
    $roles = Role::all();//Get all roles

    return view('roles.index')-&gt;with('roles', $roles);
}

/**
 * Show the form for creating a new resource.
 *
 * @return \Illuminate\Http\Response
 */
public function create() {
    $permissions = Permission::all();//Get all permissions

    return view('roles.create', ['permissions'=&gt;$permissions]);
}

/**
 * Store a newly created resource in storage.
 *
 * @param  \Illuminate\Http\Request  $request
 * @return \Illuminate\Http\Response
 */
public function store(Request $request) {
//Validate name and permissions field
    $this-&gt;validate($request, [
        'name'=&gt;'required|unique:roles|max:10',
        'permissions' =&gt;'required',
        ]
    );

    $name = $request['name'];
    $role = new Role();
    $role-&gt;name = $name;

    $permissions = $request['permissions'];

    $role-&gt;save();
//Looping thru selected permissions
    foreach ($permissions as $permission) {
        $p = Permission::where('id', '=', $permission)-&gt;firstOrFail(); 
     //Fetch the newly created role and assign permission
        $role = Role::where('name', '=', $name)-&gt;first(); 
        $role-&gt;givePermissionTo($p);
    }

    return redirect()-&gt;route('roles.index')
        -&gt;with('flash_message',
         'Role'. $role-&gt;name.' added!'); 
}

/**
 * Display the specified resource.
 *
 * @param  int  $id
 * @return \Illuminate\Http\Response
 */
public function show($id) {
    return redirect('roles');
}

/**
 * Show the form for editing the specified resource.
 *
 * @param  int  $id
 * @return \Illuminate\Http\Response
 */
public function edit($id) {
    $role = Role::findOrFail($id);
    $permissions = Permission::all();

    return view('roles.edit', compact('role', 'permissions'));
}

/**
 * Update the specified resource in storage.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  int  $id
 * @return \Illuminate\Http\Response
 */
public function update(Request $request, $id) {

    $role = Role::findOrFail($id);//Get role with the given id
//Validate name and permission fields
    $this-&gt;validate($request, [
        'name'=&gt;'required|max:10|unique:roles,name,'.$id,
        'permissions' =&gt;'required',
    ]);

    $input = $request-&gt;except(['permissions']);
    $permissions = $request['permissions'];
    $role-&gt;fill($input)-&gt;save();

    $p_all = Permission::all();//Get all permissions

    foreach ($p_all as $p) {
        $role-&gt;revokePermissionTo($p); //Remove all permissions associated with role
    }

    foreach ($permissions as $permission) {
        $p = Permission::where('id', '=', $permission)-&gt;firstOrFail(); //Get corresponding form //permission in db
        $role-&gt;givePermissionTo($p);  //Assign permission to role
    }

    return redirect()-&gt;route('roles.index')
        -&gt;with('flash_message',
         'Role'. $role-&gt;name.' updated!');
}

/**
 * Remove the specified resource from storage.
 *
 * @param  int  $id
 * @return \Illuminate\Http\Response
 */
public function destroy($id)
{
    $role = Role::findOrFail($id);
    $role-&gt;delete();

    return redirect()-&gt;route('roles.index')
        -&gt;with('flash_message',
         'Role deleted!');

}

}

@section('title', '| Roles')

@section('content')

<div class="col-lg-10 col-lg-offset-1"> <h1><i class="fa fa-key"></i> Roles

&lt;a href="{{ route('users.index') }}" class="btn btn-default pull-right"&gt;Users&lt;/a&gt;
&lt;a href="{{ route('permissions.index') }}" class="btn btn-default pull-right"&gt;Permissions&lt;/a&gt;&lt;/h1&gt;
&lt;hr&gt;
&lt;div class="table-responsive"&gt;
    &lt;table class="table table-bordered table-striped"&gt;
        &lt;thead&gt;
            &lt;tr&gt;
                &lt;th&gt;Role&lt;/th&gt;
                &lt;th&gt;Permissions&lt;/th&gt;
                &lt;th&gt;Operation&lt;/th&gt;
            &lt;/tr&gt;
        &lt;/thead&gt;

        &lt;tbody&gt;
            @foreach ($roles as $role)
            &lt;tr&gt;

                &lt;td&gt;{{ $role-&gt;name }}&lt;/td&gt;

                &lt;td&gt;{{ str_replace(array('[',']','"'),'', $role-&gt;permissions()-&gt;pluck('name')) }}&lt;/td&gt;{{-- Retrieve array of permissions associated to a role and convert to string --}}
                &lt;td&gt;
                &lt;a href="{{ URL::to('roles/'.$role-&gt;id.'/edit') }}" class="btn btn-info pull-left" style="margin-right: 3px;"&gt;Edit&lt;/a&gt;

                {!! Form::open(['method' =&gt; 'DELETE', 'route' =&gt; ['roles.destroy', $role-&gt;id] ]) !!}
                {!! Form::submit('Delete', ['class' =&gt; 'btn btn-danger']) !!}
                {!! Form::close() !!}

                &lt;/td&gt;
            &lt;/tr&gt;
            @endforeach
        &lt;/tbody&gt;

    &lt;/table&gt;
&lt;/div&gt;

&lt;a href="{{ URL::to('roles/create') }}" class="btn btn-success"&gt;Add Role&lt;/a&gt;

</div>

@endsection

@section('title', '| Add Role')

@section('content')

<div class='col-lg-4 col-lg-offset-4'>

&lt;h1&gt;&lt;i class='fa fa-key'&gt;&lt;/i&gt; Add Role&lt;/h1&gt;
&lt;hr&gt;

{{ Form::open(array('url' =&gt; 'roles')) }}

&lt;div class="form-group"&gt;
    {{ Form::label('name', 'Name') }}
    {{ Form::text('name', null, array('class' =&gt; 'form-control')) }}
&lt;/div&gt;

&lt;h5&gt;&lt;b&gt;Assign Permissions&lt;/b&gt;&lt;/h5&gt;

&lt;div class='form-group'&gt;
    @foreach ($permissions as $permission)
        {{ Form::checkbox('permissions[]',  $permission-&gt;id ) }}
        {{ Form::label($permission-&gt;name, ucfirst($permission-&gt;name)) }}&lt;br&gt;

    @endforeach
&lt;/div&gt;

{{ Form::submit('Add', array('class' =&gt; 'btn btn-primary')) }}

{{ Form::close() }}

</div>

@endsection

@section('title', '| Edit Role')

@section('content')

<div class='col-lg-4 col-lg-offset-4'> <h1><i class='fa fa-key'></i> Edit Role: {{$role->name}}</h1> <hr>

{{ Form::model($role, array('route' =&gt; array('roles.update', $role-&gt;id), 'method' =&gt; 'PUT')) }}

&lt;div class="form-group"&gt;
    {{ Form::label('name', 'Role Name') }}
    {{ Form::text('name', null, array('class' =&gt; 'form-control')) }}
&lt;/div&gt;

&lt;h5&gt;&lt;b&gt;Assign Permissions&lt;/b&gt;&lt;/h5&gt;
@foreach ($permissions as $permission)

    {{Form::checkbox('permissions[]',  $permission-&gt;id, $role-&gt;permissions ) }}
    {{Form::label($permission-&gt;name, ucfirst($permission-&gt;name)) }}&lt;br&gt;

@endforeach
&lt;br&gt;
{{ Form::submit('Edit', array('class' =&gt; 'btn btn-primary')) }}

{{ Form::close() }}    

</div>

@endsection

namespace App\Http\Middleware;

use Closure; use Illuminate\Support\Facades\Auth; use App\User;

class AdminMiddleware { /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle($request, Closure $next) { $user = User::all()->count(); if (!($user == 1)) { if (!Auth::user()->hasPermissionTo('Administer roles & permissions')) //If user does //not have this permission { abort('401'); } }

    return $next($request);
}

}

namespace App\Http\Middleware;

use Closure; use Illuminate\Support\Facades\Auth;

class ClearanceMiddleware { /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle($request, Closure $next) {
if (Auth::user()->hasPermissionTo('Administer roles & permissions')) //If user has this //permission { return $next($request); }

    if ($request-&gt;is('posts/create'))//If user is creating a post
     {
        if (!Auth::user()-&gt;hasPermissionTo('Create Post'))
     {
            abort('401');
        } 
     else {
            return $next($request);
        }
    }

    if ($request-&gt;is('posts/*/edit')) //If user is editing a post
     {
        if (!Auth::user()-&gt;hasPermissionTo('Edit Post')) {
            abort('401');
        } else {
            return $next($request);
        }
    }

    if ($request-&gt;isMethod('Delete')) //If user is deleting a post
     {
        if (!Auth::user()-&gt;hasPermissionTo('Delete Post')) {
            abort('401');
        } 
     else 
     {
            return $next($request);
        }
    }

    return $next($request);
}

}

@section('content') <div class='col-lg-4 col-lg-offset-4'> <h1><center>401<br> ACCESS DENIED</center></h1> </div>

@endsection