【问题标题】:How to make my dashboard accessible only for admin and seller in laravel?如何使我的仪表板仅对 laravel 中的管理员和卖家可访问?
【发布时间】:2020-07-27 07:30:00
【问题描述】:

DashboardController.php

class DashboardController extends Controller
{
    function __construct()
    {
        $this->middleware('auth');
    }
    // codes.....

}

最初,我为任何身份验证用户创建了一个中间线来访问此仪表板

目标:我只想为adminseller 制作这个dashboard。使普通用户无法访问仪表板路由。

怎么做?

参考表

users

         Schema::create('users', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->string('email')->unique();
            $table->string('photo')->nullable();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->longText('cartitems')->nullable();
            $table->longText('wishlist')->nullable();
            $table->unsignedBigInteger('discount')->default(0);
            $table->rememberToken();
            $table->timestamps();
        });

这是users 表。

roles

       Schema::create('roles', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->string('display_name');
            $table->timestamps();
        });

这是roles 表。每个用户都有一个角色,例如Superadminadminsellercustomer

role_user

        Schema::create('role_user', function (Blueprint $table) {
            $table->id();
            $table->unsignedBigInteger('user_id');
            $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');

            $table->unsignedBigInteger('role_id');
            $table->foreign('role_id')->references('id')->on('roles')->onDelete('cascade');

            $table->timestamps();
        });

在此数据透视表中建立usersroles 表之间的关系。

我已经尝试了这些步骤

DashboardController.php

function __construct()
{
    $this->middleware('admin');
}

Kernel.php

   'admin' => \App\Http\Middleware\Admin::class,

Admin.php [新中间线]

public function handle($request, Closure $next)
{
    dd(Auth::user());
}

但是这个Admin.php 不能不访问当前经过身份验证的用户。

它显示 null

【问题讨论】:

  • 您是使用任何角色权限包还是自己构建的??
  • 不,我没有使用任何软件包。只有我使用的 laravel auth 包。并从头开始构建。
  • 那你可以根据角色做一些中间件,用在路由上。
  • php public function handle($request, Closure $next) { if (Auth::user()->role->name == 'admin') { return $next($request); } return Redirect::route('dashboard.index'); // return $next($request); }.... 尝试...但错误....
  • 哪个错误?请在您的问题中包含此代码?

标签: laravel authentication admin middleware


【解决方案1】:

为了能够在中间件中使用auth()->user(),您需要先加载auth 中间件。有几种方法可以做到这一点,包括使用路由组直接为路由提供中间件。否则,Laravel 将无法识别有登录用户。

如果您不想这样做,还有另一种稍微粗糙的方法,但由于您正在编写自己的角色逻辑,它同样可以很好地完成工作。您可以创建一个辅助函数 hasRole() 来做同样的事情并在您的控制器中使用它。

编辑:这是我为权限而不是角色所做的事情,但我认为它可能会有所帮助:

if(!function_exists('hasPermission')){
    function hasPermission($permissionName){
        if(auth()->check()) {

            $user = \App\Admin::where('id', auth()->user()->id)->with('role.permissions')->first();
            $permission = \App\AdminPermissions::where('name', $permissionName)->first();
            return response()->json($user->role->permissions->contains($permission));

        } else {

            return 'Unauthenticated';
        }
    }
}

【讨论】:

  • 如何使用'hasRole()'?请你帮帮我。这应该写在用户模型中的关系吗?
  • @ImrulHasan 我通常会创建一个名为helpers.php 的文件,并在其中包含我所有的辅助函数。然后我将它包含在作曲家自动加载数组中,并且可以在任何地方使用它。至于 hasRole($role) 函数本身,它基本上是auth()->check(),然后使用与用户模型的角色关系来检查该用户是否具有该角色。
  • 如果你给我一些参考链接。这会很有帮助。我对此缺乏了解。
  • @ImrulHasan 如果你想我为帮助函数制作了一个文档并有一个角色代码。
  • @ImrulHasan 这是一个帮助函数的链接。我会将 hasRole 的代码添加到我的答案laravel-news.com/creating-helpers
【解决方案2】:

我已经用类似的方式完成了。但我没有遇到任何问题。

如果你把所有东西都放在正确的位置,它应该可以工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-17
    • 1970-01-01
    • 2017-03-02
    • 1970-01-01
    • 2015-10-11
    • 2017-04-29
    • 2019-02-20
    相关资源
    最近更新 更多