Laravel:如何检查用户是否是管理员?

时间:2016-05-07 20:45:27

标签: php laravel

我想让用户成为管理员,在网站入口处检查条件==用户登录,如果是,则授予删除或编辑产品的权利。到目前为止,这是我的代码:

@if(Auth::check())
   <p><a href="#" class="btn btn-success" role="button">Edite</a> <a href="#" class="btn btn-danger" role="button">Remove</a></p>
@endif

如何将Auth::check()与我的登录名称相提并论?

10 个答案:

答案 0 :(得分:11)

首先,您需要创建包含角色详细信息的角色表。 (我假设每个用户可能不仅有多个角色管理员)

角色表:

    Schema::create('role', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name');
    });

然后

role_user表

Schema::create('user_role', function (Blueprint $table) {
    $table->bigInteger('user_id')->unsigned();
    $table->integer('role_id')->unsigned();
    $table->foreign('user_id')
        ->references('id')->on('user');
    $table->foreign('role_id')
        ->references('id')->on('role');
});

创建角色模型:

然后将角色关系添加到用户模型

class User extends Authenticatable {
    public function roles() {
        return $this->belongsToMany(Role::class, 'user_role');
    }
}

要检查用户是否具有管理员角色,您可以执行类似

的操作
@if($user->roles()->where('name', 'Administrator')->exists())
enter code here
@endif

或者您可以将以下功能放在用户模型中,而不是执行此语句:

public function isAdministrator() {
   return $this->roles()->where('name', 'Administrator')->exists();
}

然后在你的模型中你可以调用它:

@if(Auth::user()->isAdministrator())
enter code here
@endif

其他可能性(1 - 1)关系

首先在迁移中添加is_admin列

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();
    });

然后你可以检查

@if($user->is_admin)

@endif

答案 1 :(得分:5)

标准方法是做xdevnull提到的。但是对于小项目,你可以这样做:

If(Auth::check() && Auth::user()->isAdmin()) {
  dd("you are admin") ;
}

在您的用户模型中创建方法isAdmin()

function isAdmin() {
  $admin_emails = config('settings.admin_emails');
  if(in_array($this->email, $admin_emails)  return true;
  else return false;
}

当然,您需要在app / config文件夹中创建一个名为settings的配置文件。

并将其放入settings.php

<?php
return ['admin_emails' => explode(', ',  env('ADMIN_EMAILS'));]

最后在你的.env文件中添加:     ADMIN_EMAILS = USER1 @ example.com,用户2 @ example.com

添加尽可能多的电子邮件,您可以使用逗号

现在,如果登录用户的电子邮件地址为user1@example.com或user2@example.com,那么她就是管理员。

另请注意,我已在env文件中添加了管理员电子邮件,以便可以根据环境更改管理员。在开发中,开发人员通常是管理员,而在生产中,其他人(客户端?)是管理员。

<强> P.S。不要忘记在创建settings.php文件后运行php artisan config:cache

答案 2 :(得分:1)

这里你去

  @if(Auth::check() && Auth::user()->role == "admin")

  @endif

你必须将role属性添加到你的数据库中它应该包含admin或其他任何东西(你也可以使用bolean属性)

答案 3 :(得分:1)

对我有用的东西

在控制器中: $user=Auth::user()->role()->where('name', 'admin')->exists(); return view('user.index', compact('user'));

在视图中: @if($user) enter code here ... @endif

答案 4 :(得分:1)

对于 Laravel 7 或 8 (这是对 devnull 答案的更新,我认为这是最好的方法)

在您的项目文件夹中创建以下模型:

$ php artisan make:model Role -m
$ php artisan make:model role_user -m 

这将生成文件:

  • create_roles_table.php
  • create_role_users_table.php
  • 模型/角色.php
  • 模型/role_user.php

将以下字段添加到 create_roles_table.php 架构:

$table->id();
$table->string('name');
$table->timestamps();

将以下字段和外键关系添加到 create_role_users_table.php Schema 并通过删除 Laravel 在 'role_users' 上添加的字母 's' 来更改表名:

Schema::create('role_user', function (Blueprint $table) {
  // having $table->id(); here is optional
  $table->bigInteger('user_id')->unsigned();
  $table->bigInteger('role_id')->unsigned();
  $table->foreign('user_id')->references('id')->on('users');
  $table->foreign('role_id')->references('id')->on('roles');
}

同时在down方法Schema中将'role_users'重命名为'role_user':

Schema::dropIfExists('role_user');

运行您的迁移:

$ php artisan migrate

根据您的需要向您的角色表添加一些数据,例如:

id: 1 | name: "Admin"
id: 2 | name: "Moderator"
id: 3 | name: "Basic"

转到用户模型并创建处理角色和用户之间关系的函数:

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

这允许用户拥有多个角色(用户可以是管理员、版主和基本用户)。

还在用户模型中创建一个或多个函数以根据您的项目需要检查用户角色:

public function isAdmin() {
   return $this->roles()->where('name', 'Admin')->exists();
}

public function isModerator() {
   return $this->roles()->where('name', 'Moderator')->exists();
}

等等...

确保用户表中至少有一个用户。现在您可以向 role_user 表添加值。

从刀片中,您可以检查用户是管理员还是您创建的任何角色,调用我们在用户模型中创建的函数:

@guest

   You are not logged in

@else

   You are logged in!

   @if(Auth::user()->isAdmin())
     You are an Admin, showing Admin options...
   @endif

   @if(Auth::user()->isModerator())
     You are a Moderator, showing Moderator options
   @endif

@endguest

答案 5 :(得分:1)

如果您有一个附加到用户表的角色列,请执行此操作

在 User.php 文件的 User 模型中添加这个

public function isAdmin() {
  return $this->role == 'admin'
}

public function isCouple() {
  return $this->role == 'couple'  
}

public function isServiceProvider() {
  return $this->role == 'serviceProvider'
}

在你的刀片中使用这个

@if(Auth::user()->isServiceProvider())
 //am a service provider
@endif

答案 6 :(得分:0)

在laravel 5.5中。这对我有用:

&#13;
&#13;
@if(Auth::check() && Auth::user()->role['name'] == "admin")
   // You are an Admin                    
@endif
&#13;
&#13;
&#13;

答案 7 :(得分:0)

@if (Auth::guard($guard)->check() && Auth::user()->role->id==1)  
          return redirect()->route('admin.dashboard');
  @endif

答案 8 :(得分:0)

@auth
    @if(auth()->user()->role_id == 1)
       i am Admin
    @endif
@endauth

答案 9 :(得分:0)

您必须在您的 UsersTable 迁移中编写以下代码:

 $table->enum('role',  ['user', 'manager', 'admin'])->default('user');

在第二步运行迁移, 然后像这样在 app/Providers/AuthServiceProvider.php 中定义你的门:

namespace App\Providers;
  
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
use Illuminate\Support\Facades\Gate;
  
class AuthServiceProvider extends ServiceProvider
{
    /**
     * The policy mappings for the application.
     *
     * @var array
     */
    protected $policies = [
            
    ];
  
    /**
     * Register any authentication / authorization services.
     *
     * @return void
     */
    public function boot()
    {
        $this->registerPolicies();
   
        /* define a admin user role */
        Gate::define('isAdmin', function($user) {
           return $user->role == 'admin';
        });
       
        /* define a manager user role */
        Gate::define('isManager', function($user) {
            return $user->role == 'manager';
        });
      
        /* define a user role */
        Gate::define('isUser', function($user) {
            return $user->role == 'user';
        });
    }
}

现在您可以在 view.blade 文件中使用 isAdminisUserisManager 方法

喜欢这个

  @can('isAdmin')
      <div class="btn btn-success btn-lg">
          You have Admin Access
      </div>
  @elsecan('isManager')
      <div class="btn btn-primary btn-lg">
          You have Manager Access
      </div>
  @else
      <div class="btn btn-info btn-lg">
          You have User Access
      </div>
  @endcan

毕竟还有很多其他方法可以做到; 你可以参考这个链接了解更多详情 my source