Как разрешить только администратору возможность удалять / редактировать информацию о пользователях, используя laravel? - PullRequest
0 голосов
/ 13 февраля 2020

У меня есть панель управления, в которой у меня несколько пользователей, я хотел бы, чтобы единственный администратор мог редактировать или удалять информацию о пользователе, обычный пользователь должен иметь возможность редактировать / удалять свою учетную запись.

Здесь это то, что я пробовал до сих пор

Промежуточное ПО для администратора

use Closure;
use Auth;
class IsAdmin
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if (Auth::user() &&  Auth::user()->admin == 1) {
            return $next($request);
     }

    return redirect('/home');
    }
}

Вот тело таблицы users.index, где я отображаю данные

 <tbody>
  @foreach($users as $user)
    <tr>
      <td>
        {{ $user->name }}
      </td>
      <td>
        {{ $user->email }}
      </td>
      <td>
        {{ $user->created_at->format('Y-m-d') }}
      </td>
      <td class="td-actions text-right">
        @if ($user->is_admin != auth()->id())
          <form action="{{ route('user.destroy', $user) }}" method="post">
              @csrf
              @method('delete')

              <a rel="tooltip" class="btn btn-success btn-link" href="{{ route('user.edit', $user) }}" data-original-title="" title="">
                <i class="material-icons">edit</i>
                <div class="ripple-container"></div>
              </a>
              <button type="button" class="btn btn-danger btn-link" data-original-title="" title="" onclick="confirm('{{ __("Are you sure you want to delete this user?") }}') ? this.parentElement.submit() : ''">
                  <i class="material-icons">close</i>
                  <div class="ripple-container"></div>
              </button>
          </form>
        @else
          <a rel="tooltip" class="btn btn-success btn-link" href="{{ route('profile.edit') }}" data-original-title="" title="">
            <i class="material-icons">edit</i>
            <div class="ripple-container"></div>
          </a>
        @endif
      </td>
    </tr>
  @endforeach

Данные из таблицы выглядят вот так

 #original: array:9 [▼
        "id" => 2
        "name" => "Royaladd"
        "email" => "kaczkapojebana@gmail.com"
        "email_verified_at" => null
        "password" => "$2y$10$3SIVxXu/SyF0vdavnV.DTOcljEqlhAH5J6LV.KmCezdQ4XA11N5m."
        "remember_token" => null
        "created_at" => "2020-02-12 10:36:40"
        "updated_at" => "2020-02-12 10:36:40"
        "is_admin" => 0
      ]

К сожалению, в приведенном выше решении любой пользователь может редактировать или удалять пользовательские фрагменты информации.

Что мне нужно сделать, чтобы добиться того, чего я хочу?

Ответы [ 4 ]

1 голос
/ 13 февраля 2020

Я не знаю, как вы настраиваете аутентификацию и пользователя. Обычно, когда пользователь входит в систему, функция аутентификации устанавливает только информацию пользователя basi c, и если он вошел в систему или нет.

Я предполагаю, что у вас есть is_admin в качестве столбца является таблицей пользователя.

В вашей модели пользователя вам нужно иметь функцию, чтобы проверить, является ли пользователь администратором или нет, у вас есть Auth :: id (), которая содержит идентификатор пользователя, а затем проверить из запроса если этот идентификатор пользователя равен admin или no и верните его как true false

public function isAdmin() {
   $user= App\user::find(Auth::id());
   // you can also put it in session
   // this session line can add in handle function and call $user->is_admin()
   $this->request->session()->put('is_admin', $user->is_admin); 
   return $user->is_admin; // you can add if check to return true false if you want
}

и по вашему мнению

 @if ($user->is_admin()){
   // everything here is only accessible if its true
 }

PS. там могут быть ошибки кода, просто возьмите логи c

1 голос
/ 13 февраля 2020

Убедитесь, что у вас есть роль столбец или атрибут в таблице пользователей базы данных. Создайте Midlleware, как это

php artisan make:middleware AuthMiddleware

Затем

public function handle($request, Closure $next)
{
    if (\Auth::user()->role == 'admin') {
      return $next($request);
    }

      return redirect('home');
}

В вашем ядре

protected $routeMiddleware = [
'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
'can' => \Illuminate\Auth\Middleware\Authorize::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
'admin' => \App\Http\Middleware\YourMiddleware::class,

Защитите свой маршрут

Route::get('admin/profile/{id}/delete', function () {
//
})->middleware('admin');

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

0 голосов
/ 13 февраля 2020

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

// -- admin --
Route::middleware(['admin'])->group(function () {

Это означает, что только администраторы могут получить доступ к этим маршрутам, в противном случае пользователь будет перенаправлен , Затем вы можете отредактировать ваше промежуточное ПО администратора, чтобы оно принимало запрос, если аутентифицированный пользователь совпадает с пользователем, которого вы передаете на маршрут?

0 голосов
/ 13 февраля 2020
public function handle($request, Closure $next)
{
    if (Auth::user() &&  Auth::user()->is_admin == 1) {
        return $next($request);
 }

Вы проверяете Auth::user->admin == 1, пожалуйста, измените это условие на Auth::user()->is_admin == 1 согласно вашим Auth::user() данным

...