📅  最后修改于: 2023-12-03 14:43:44.675000             🧑  作者: Mango
在Laravel中,Auth框架是一种实现身份验证和授权的常用方式。通常情况下,您可以使用默认的登录和注册模板来设置身份验证系统。但是,并不是所有的用户都可以访问您的应用程序中的所有页面,某些页面可能只有特定角色的用户可以访问。因此,基于角色的重定向变得很重要。
本文介绍如何基于角色重定向Laravel应用程序中的用户。我们将使用Laravel 8和Bootstrap 4作为依赖项。
首先,我们需要安装Laravel 8。您可以从Laravel官网(https://laravel.com/docs/8.x/installation)下载并安装Laravel。
在安装了Laravel后,我们需要在终端中使用以下命令创建新的Laravel应用程序。
laravel new laravel-auth-redirect
使用以下命令生成迁移文件。
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
使用以下命令安装Laravel的身份认证系统。
composer require laravel/ui
php artisan ui bootstrap --auth
npm install && npm run dev
现在我们已经设置了用户模型和数据库迁移,然后我们需要在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'
],
]);
}
}
我们使用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”页面。
打开“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');
});
以上代码块定义了两个路由:
创建“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
现在,我们完成了所有必要的设置。使用以下命令启动Laravel应用程序。
php artisan serve
现在,打开浏览器并访问以下URL进行测试。
您将看到根据用户角色不同的页面并进行了正确的重定向。
本文实现了基于角色的重定向,以确保用户只能访问特定页面。我们使用Laravel Auth中间件来验证用户角色,并且根据角色将用户重定向到特定页面。我们还通过创建用户和指定角色,在用户模型中存储角色。