📜  Laravel Auth Redirect 基于角色 - PHP (1)

📅  最后修改于: 2023-12-03 14:43:44.675000             🧑  作者: Mango

Laravel Auth Redirect 基于角色 - PHP

在Laravel中,Auth框架是一种实现身份验证和授权的常用方式。通常情况下,您可以使用默认的登录和注册模板来设置身份验证系统。但是,并不是所有的用户都可以访问您的应用程序中的所有页面,某些页面可能只有特定角色的用户可以访问。因此,基于角色的重定向变得很重要。

本文介绍如何基于角色重定向Laravel应用程序中的用户。我们将使用Laravel 8和Bootstrap 4作为依赖项。

步骤1:安装Laravel 8

首先,我们需要安装Laravel 8。您可以从Laravel官网(https://laravel.com/docs/8.x/installation)下载并安装Laravel。

步骤2:创建Laravel应用程序

在安装了Laravel后,我们需要在终端中使用以下命令创建新的Laravel应用程序。

laravel new laravel-auth-redirect
步骤3:设置数据库

使用以下命令生成迁移文件。

php artisan make:migration create_users_table

打开“database\migrations\create_users_table.php”文件并添加以下代码。

public function up()
{
    Schema::create('users', function (Blueprint $table) {
        $table->id();
        $table->string('name');
        $table->string('email')->unique();
        $table->timestamp('email_verified_at')->nullable();
        $table->string('password');
        $table->string('role')->default('user'); // Add role column
        $table->rememberToken();
        $table->timestamps();
    });
}

运行以下命令来运行数据库迁移

php artisan migrate
步骤4:安装认证系统

使用以下命令安装Laravel的身份认证系统。

composer require laravel/ui
php artisan ui bootstrap --auth
npm install && npm run dev
步骤5:创建用户

现在我们已经设置了用户模型和数据库迁移,然后我们需要在User模型中创建一些默认用户并为每个用户设置不同的角色。

use Illuminate\Support\Facades\Hash;

class UserTableSeeder extends Seeder
{
    public function run()
    {
        DB::table('users')->insert([
            [
                'name' => 'Admin',
                'email'  => 'admin@example.com',
                'password' => Hash::make('password'),
                'role' => 'admin'
            ],
            [
                'name' => 'User',
                'email'  => 'user@example.com',
                'password' => Hash::make('password'),
                'role' => 'user'
            ],
        ]);
    }
}
步骤6:设置角色

我们使用Laravel Auth中的“Authenticate”中间件来验证用户是否具有特定角色。打开“app\Http\Middleware\Authenticate.php”文件并添加以下代码在“handle”方法中。

public function handle($request, Closure $next, ...$guards)
{
    $user = Auth::user();

    if (! $user) {
        return redirect()->route('login');
    }

    if (in_array('admin', explode(',', $user->role)) && !in_array('admin', $guards)) {
        return redirect()->route('admin.dashboard');
    }

    if (in_array('user', explode(',', $user->role)) && !in_array('user', $guards)) {
        return redirect()->route('user.dashboard');
    }

    return $next($request);
}

这段代码检查用户是否拥有特定角色,并相应地将用户重定向到特定页面。在以上例子中,如果用户拥有“admin”角色,他将被重定向到“admin.dashboard”页面,如果用户拥有“user”角色,他将被重定向到“user.dashboard”页面。

步骤7:设置路由

打开“routes\web.php”并添加以下代码。

Route::get('/', function () {
    return view('welcome');
});

Auth::routes();

Route::group(['middleware' => ['auth', 'roles'], 'roles' => 'admin'], function () {
    Route::get('/admin/dashboard', function () {
        return view('admin.dashboard');
    })->name('admin.dashboard');
});

Route::group(['middleware' => ['auth', 'roles'], 'roles' => 'user'], function () {
    Route::get('/user/dashboard', function () {
        return view('user.dashboard');
    })->name('user.dashboard');
});

以上代码块定义了两个路由:

  1. “/admin/dashboard”:可以通过拥有“admin”角色的用户访问
  2. “/user/dashboard”:可以通过拥有“user”角色的用户访问
步骤8:设置视图

创建“admin\dashboard.blade.php”文件并添加以下代码:

@extends('layouts.app')

@section('content')
    <div class="container">
        <div class="row justify-content-center">
            <div class="col-md-8">
                <div class="card">
                    <div class="card-header">{{ __('Admin Dashboard') }}</div>

                    <div class="card-body">
                        {{ __('Welcome to Admin Dashboard') }}
                    </div>
                </div>
            </div>
        </div>
    </div>
@endsection

创建“user\dashboard.blade.php”文件并添加以下代码:

@extends('layouts.app')

@section('content')
    <div class="container">
        <div class="row justify-content-center">
            <div class="col-md-8">
                <div class="card">
                    <div class="card-header">{{ __('User Dashboard') }}</div>

                    <div class="card-body">
                        {{ __('Welcome to User Dashboard') }}
                    </div>
                </div>
            </div>
        </div>
    </div>
@endsection
步骤9:启动Laravel应用程序

现在,我们完成了所有必要的设置。使用以下命令启动Laravel应用程序。

php artisan serve

现在,打开浏览器并访问以下URL进行测试。

  1. http://localhost:8000/
  2. http://localhost:8000/admin/dashboard(仅适用于拥有admin角色的用户)
  3. http://localhost:8000/user/dashboard(仅适用于拥有user角色的用户)

您将看到根据用户角色不同的页面并进行了正确的重定向。

总结

本文实现了基于角色的重定向,以确保用户只能访问特定页面。我们使用Laravel Auth中间件来验证用户角色,并且根据角色将用户重定向到特定页面。我们还通过创建用户和指定角色,在用户模型中存储角色。