几天来我在访问为我的中间件定义的路由方面遇到了问题。所有这一切的具体问题是,例如,当我想输入除用户之外的实体的 URL 时,它总是让我返回主页,无论登录用户具有什么用户角色。我将代码的重要部分留在这里,以防有人知道原因:
用户模型:
<?php
namespace App\Models;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
class User extends Authenticatable
{
use Notifiable;
protected $fillable = [
'name',
'email',
'password',
'rol_usuario',
'fecha_nacimiento',
'sexo',
'tarjeta_credito',
];
protected $hidden = [
'password',
];
protected $casts = [
'email_verified_at' => 'datetime',
];
}
UsuariosController中的登录功能:
public function login(Request $request)
{
$credentials = $request->only('email', 'password');
if (Auth::attempt($credentials)) {
Log::info('Inicio de sesión exitoso para el email: ' . $request->input('email'));
return redirect()->route('home');
}
return back()->withErrors([
'email' => 'Las credenciales son incorrectas.',
])->onlyInput('email');
}
管理员中间件:
public function handle($request, Closure $next) : Response
{
if (!Auth::check()) {
return redirect()->route('login.form')->withErrors('Debes iniciar sesión para acceder a esta página.');
}
if (Auth::user()->rol_usuario !== 'administrador') {
return redirect()->route('home')->withErrors('No tienes permiso para acceder a esta página.');
}
return $next($request);
}
web.php:
// Rutas de autenticación de usuarios
Route::get('login', [UsuariosController ::class, 'create'])->name('login');
Route::post('login', [UsuariosController::class, 'store']);
Route::post('logout', [UsuariosController::class, 'destroy'])->name('logout');
// Rutas para la gestión de carteras
Route::middleware(['auth', 'administrador'])->group(function () {
Route::get('carteras', [CarteraController::class, 'index'])->name('carteras.index');
Route::get('carteras/create', [CarteraController::class, 'create'])->name('carteras.create');
Route::post('carteras/create', [CarteraController::class, 'store'])->name('carteras.store');
});
我尝试将 user_role 属性引入 $credentials 变量,但它不会以任何方式接受它,对于 Users 实体的 url,我访问它没有问题,但对于 Portfolio 来说,只有在其中创建的方法的索引控制器可访问。
首先,您不能向凭据变量添加任何内容。因为您使用此变量来检查用户是否可以登录您的系统。 我的意思是尝试函数具有特定的输入,因此如果您想向凭据添加其他值,您应该自定义尝试函数并编写自定义算法。 如果您想在应用程序中处理角色权限,您可以使用 laravel spatie 包。
否则,如果您不喜欢 spatie 包的复杂性,您可以调试您的应用程序。因此,在中间件中添加
dd(Auth::user()->rol_usuario)
来了解您的用户角色是什么。确保您的用户具有所需的角色。