簡體   English   中英

如何僅允許管理員使用 laravel 刪除/編輯用戶信息?

[英]How do I allow only admin to be able to delete/edit users informations using laravel?

我有一個儀表板,其中有多個用戶,我希望唯一的管理員能夠編輯或刪除用戶信息,普通用戶應該能夠編輯/刪除他的帳戶。

這是我迄今為止嘗試過的

管理員中間件

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
      ]

不幸的是,上述解決方案任何用戶都可以編輯或刪除用戶信息。

我需要做什么才能實現我想要的?

我不知道你是如何設置 auth 和 user 通常當用戶登錄時,你的 auth 功能只設置用戶的基本信息,以及他是否登錄。

我假設你有 is_admin 作為一列是用戶表。

在您的用戶模型中,您需要有一個函數來檢查用戶是否為管理員,您是否擁有包含用戶 ID 的 Auth::id(),然后從查詢中檢查此用戶 ID 是否為管理員,並將其返回為 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
 }

附注。 可能有代碼錯誤,只是采取邏輯

確保您在數據庫用戶表中有角色列或屬性。 像這樣創建一個中間件

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');

希望這可以幫助

public function handle($request, Closure $next)
{
    if (Auth::user() &&  Auth::user()->is_admin == 1) {
        return $next($request);
 }

您正在檢查Auth::user->admin == 1請根據您的Auth::user()數據將此條件更改為Auth::user()->is_admin == 1

在您的網絡路由中,通過將您的管理中間件包裝在一個中間件組中,將您的管理中間件應用於您的用戶刪除和編輯路由。

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

這意味着只有管理員才能訪問這些路由,否則用戶將被重定向。 如果經過身份驗證的用戶與您傳遞給路由的用戶相同,那么您可以編輯您的管理中間件以接受請求?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM