如何在laravel刀片视图中检查用户是否为Admin

时间:2016-01-08 15:49:07

标签: laravel eloquent laravel-5.1

我有

用户表如

+==============+
|     User     |
+==============+
|      id      |
+--------------+
|   firstname  |
+--------------+
|    lastname  |
+--------------+
|     email    |
+--------------+
|   password   |
+--------------+

和我的角色表

+==============+
|     Roles    |
+==============+
|      id      |
+--------------+
|     name     |
+--------------+

我的role_user表是

+=============+
|  role_user  |
+=============+
|   user_id   |
+-------------+
|   role_id   |
+-------------+

如何检查当前登录的用户是管理员还是普通用户?

5 个答案:

答案 0 :(得分:13)

您需要在roles模型中添加User关系,如下所示:

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

现在你需要像这样创建isAdmin用户:

public function isAdmin() 
{
   return in_array(1, $this->roles()->pluck('role_id')->all());
}

作为1,您输入了管理员角色的ID。当然它也可以用其他方式定义,但一切都取决于如何使用它。

也可以这样定义:

public function isAdmin() 
{
   return $this->roles()->where('role_id', 1)->first();
}

现在在你的刀片中,你可以做到:

@if (auth()->check())
   @if (auth()->user()->isAdmin())
      Hello Admin
   @else
      Hello standard user
   @endif
@endif

答案 1 :(得分:3)

<强> Role.php     

use Illuminate\Database\Eloquent\Model;

class Role extends Model {

    protected $fillable = [
        'name'
    ];

    /**
     * A role can have many users.
     *
     * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
     */
    public function users() {

        return $this->belongsToMany('App\User');
    }

}

然后您可以将其添加到用户模型

public function isAdmin()
{
    foreach ($this->roles()->get() as $role)
    {
        if ($role->name == 'Admin')
        {
            return true;
        }
    }
}

查看

@if(Auth::check())
    @if (Auth::user()->isAdmin())
        <h2>Admin user enter code here<h2>
    @endif
@endif

答案 2 :(得分:1)

这不是ACL这个简单的功能,您甚至不需要数据库表roles,您可以添加额外的tinyInteger status列并添加数字,例如:

  • 0 =已停用
  • 1 =访客
  • 2 = Admin。

要使其正常运行,请将以下代码添加到User.php

public function isDisabled ()
{
    return $this->statusCheck();
}

public function isVisitor ()
{
    return $this->statusCheck(1);
}

public function isAdmin ()
{
    return $this->statusCheck(2);
}

protected function statusCheck ($status = 0)
{
    return $this->status === $status ? true : false;
}

要检入blade模板,您可以添加

@if(Auth::user()->isDisabled())
    You are not Active
@elseif(Auth::user()->isVisitor())
    Welcome to example.com
@elseif(Auth::user()->isAdmin())
    Welcome Admin
@endif

此外,您可以制作刀片自定义指令,并将此代码粘贴到app/providers/AppServiceProvider.php方法中的boot()

// Blade custom directives for isAdmin

    Blade::directive('isAdmin', function() {
        return "<?php if(Auth::user()->isAdmin()): ?>";
    });

    Blade::directive('endisAdmin', function() {
        return "<?php endif; ?>";
    });

// Blade custom directives for isVisitor

    Blade::directive('isVisitor', function() {
        return "<?php if(Auth::user()->isVisitor()): ?>";
    });

    Blade::directive('endisVisitor', function() {
        return "<?php endif; ?>";
    });

// Blade custom directives for isDisabled

    Blade::directive('isDisabled', function() {
        return "<?php if(Auth::user()->isDisabled()): ?>";
    });

    Blade::directive('endisDisabled', function() {
        return "<?php endif; ?>";
    });

要调用此方法,您需要在blade view

中编写以下行
@isAdmin()
     Welcome Admin
@endisAdmin

@isVisitor()
     Welcome to example.com
@endisVisitor

@isDisabled()
     Your are not active
@endisDisabled

简而言之,laravel为您提供了多种解决问题的方法,它只取决于您的需求和应用程序结构。

答案 3 :(得分:0)

方法共享工作。问题是如果你必须每页检查多次,它会多次访问数据库。例如,假设您有一个包含8个链接的导航。第一,第四和第七个链接只能由管理员显示。该查询将使您的数据库达到3倍。也许我只是肛门,但这是一个重复的请求。

我正在尝试找到另一种方法来存储在视图/模板中加载一次的变量,这样每次我需要检查它是否是管理员时,我检查变量而不是每次都打到数据库。我是通过控制器完成的 - &gt;查看,但不仅仅是在模板中单独查看。我正在考虑创建一个辅助方法,并在每页加载时返回一个要检查的对象。

答案 4 :(得分:-2)

所以你有一些字段isAdmin,如果它是1,例如用户是管理员,如果不是。当用户下载时,请检查(Auth::user()->isAdmin == 1),然后用户是管理员,否则不是

使用Auth::user()->你可以检查当前登录用户的用户表中的任何字段。

最好的问候