Как запретить обычному пользователю создавать и обновлять книги? - PullRequest
0 голосов
/ 16 апреля 2020

Я реализую пользовательские роли в проекте, в котором реализованы книги crud. Я хочу, чтобы только админ мог создавать, обновлять и удалять книги. В моем app.blade. php я пишу следующий код

<ul class="nav navbar-nav navbar-right">
                            <!-- Authentication Links -->
                            @if (Auth::guest())
                            <li><a href="{{ url('/login') }}">Login</a></li>
                            <li><a href="{{ url('/register') }}">Register</a></li>
                            @else
                            @if(auth()->user()->hasRole('User'))
                                <li>
                                    <a href=""> User </a>
                                </li>
                            @endif
                            <li class="dropdown">
                                <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false">
                                    {{ Auth::user()->name }} <span class="caret"></span>
                                </a>

                                <ul class="dropdown-menu" role="menu">
                                    <li>
                                        <a href="{{ url('/logout') }}"
                                           onclick="event.preventDefault();
                                                   document.getElementById('logout-form').submit();">
                                            Logout
                                        </a>

                                        <form id="logout-form" action="{{ url('/logout') }}" method="POST" style="display: none;">
                                            {{ csrf_field() }}
                                        </form>
                                    </li>

                                </ul>
                            </li>

                            <li><a href="{{ url('/books/index') }}">Books</a></li>

                            @if(auth()->user()->hasRole('admin'))
                            <li><a href="{{ url('/categories/index') }}">Categories</a></li>
                            <li><a href="{{ url('/authors/index') }}">Authors</a></li>
                            <li><a href="{{ url('/publishers/index') }}">Publishers</a></li>
                            @endif
                            @endif
                        </ul>
                    </div>

Когда я вхожу в систему как пользователь, это только дает мне просмотр книг, но когда я ставлю http://127.0.0.1: 8000 / books / create в браузере, затем он переходит к представлению создания книг, и книга создается enter image description here

Но я хочу, чтобы, если бы я вошел в систему как пользователь, то мог бы не создавать или обновлять книги. Как я могу решить это?

Ответы [ 2 ]

0 голосов
/ 16 апреля 2020

Вам необходимо промежуточное ПО для защиты вашего маршрута от доступа ограниченного пользователя.
Создайте промежуточное ПО, подобное этому, в папке промежуточного ПО

<?php

namespace App\Http\Middleware;

use Closure;

class CheckRole
{
    public function handle($request, Closure $next)
    {

        if($request->user()->hasRole('admin'){
            return $next($request);
        }else{
            return abort(403,'Unauthorized Access');
        }
    }
}

А теперь поместите промежуточное ПО в массив промежуточного ПО маршрута в файле ядра:

protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
        'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
        'can' => \Illuminate\Auth\Middleware\Authorize::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
        'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,

        //Add the role middleware like this which we have just created.
        'roles' => \App\Http\Middleware\CheckRole::class,
    ];

И, наконец, добавьте ваши маршруты в группу следующим образом.

Route::group(['middleware' => ['roles', 'auth:web']], function ($router) {
     // Place your route here

});

И, наконец, не забудьте очистить кеш конфигурации с помощью этой команды:

php artisan cache:config

Надеюсь, это поможет вам

0 голосов
/ 16 апреля 2020
Try This code.
I think you are using auth() in blade Try AUth() in your if condition. 
@if(Auth()->user()->hasRole('admin'))
<li><a href="{{ url('/categories/index') }}">Categories</a></li>
<li><a href="{{ url('/authors/index') }}">Authors</a></li>
<li><a href="{{ url('/publishers/index') }}">Publishers</a></li>
@endif

Other Possibility is:

First add is_admin column in your migration

public function up()
{
Schema::create('user', function (Blueprint $table) {
    $table->increments('id');
    $table->string('name');
    $table->string('email')->unique();
    $table->string('password');
    $table->boolean('is_admin')->default(0);
    $table->rememberToken();
    $table->timestamps();
});

Then you can check

@if($user->is_admin)

@endif
...