Laravel Nova 实现仅活跃用户登录,禁用非活跃用户并强制登出
实现Laravel Nova的非活跃用户限制功能
以下是针对需求的分步实现方案,明确标注每个步骤需要编辑的文件及路径:
1. 禁止非活跃用户登录并显示提示信息
需要编辑的文件:
app/Providers/NovaServiceProvider.php- (可选,若需自定义错误显示)
resources/views/nova/login.blade.php(需先发布Nova视图)
实现代码:
- 在
NovaServiceProvider.php的boot()方法中扩展Nova的认证逻辑,校验用户活跃状态:
use Laravel\Nova\Nova; use Laravel\Nova\Http\Requests\LoginRequest; public function boot() { parent::boot(); // 自定义Nova登录认证逻辑 Nova::authenticateUsing(function (LoginRequest $request) { $user = \App\Models\User::where('email', $request->email)->first(); // 校验密码是否正确 if (! $user || ! \Hash::check($request->password, $user->password)) { return null; } // 校验用户是否活跃 if (! $user->active) { session()->flash('error', 'only active users allowed to login'); return null; } return $user; }); }
- (可选)如果默认Nova登录视图未显示自定义错误,先发布Nova视图文件:
php artisan nova:publish --views
然后编辑resources/views/nova/login.blade.php,在登录表单上方添加错误提示:
@if(session('error')) <div class="mb-6 rounded-lg bg-red-50 p-4"> <p class="text-sm text-red-600">{{ session('error') }}</p> </div> @endif
2. 强制已登录的非活跃用户登出
需要编辑的文件:
app/Http/Middleware/CheckUserActive.php(新建)app/Http/Kernel.php
实现步骤:
- 创建校验用户活跃状态的中间件:
执行命令生成中间件:
php artisan make:middleware CheckUserActive
编辑生成的app/Http/Middleware/CheckUserActive.php:
namespace App\Http\Middleware; use Closure; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; class CheckUserActive { public function handle(Request $request, Closure $next) { // 若用户已登录但账号非活跃,强制登出并跳转登录页 if (Auth::check() && ! Auth::user()->active) { Auth::logout(); return redirect()->route('nova.login')->with('error', 'Your account is no longer active. You have been logged out.'); } return $next($request); } }
- 将中间件添加到Nova的路由中间件组,编辑
app/Http/Kernel.php:
找到$middlewareGroups中的nova组,添加自定义中间件:
protected $middlewareGroups = [ // ...其他中间件组 'nova' => [ \Laravel\Nova\Http\Middleware\Authenticate::class, \Laravel\Nova\Http\Middleware\Authorize::class, \Laravel\Nova\Http\Middleware\BootTools::class, \Laravel\Nova\Http\Middleware\DispatchServingNovaEvent::class, \App\Http\Middleware\CheckUserActive::class, // 新增此行 ], ];
内容的提问来源于stack exchange,提问作者David Gabbay
相关产品推荐
相关产品推荐

