【发布时间】:2021-11-12 11:34:05
【问题描述】:
我正在尝试使用中间件来保护基于角色的路由。
我正在测试这条路线,只允许角色administrador 能够进入它。
Route::get('/gestionarMedicos', [PersonaController::class,'mostrarMedicos'])->name('personaMostrarMedicos')->middleware('auth','firstLogin','role:administrador');
这是我的中间件的代码(在路由中称为路由)
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
class EnsureUserHasRole
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle(Request $request, Closure $next, $role)
{
if (! $request->user()->hasRole($role)) {
// Redirect...
return back();
}
return $next($request);
}
}
这是用户模型的代码
<?php
namespace App\Models;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Illuminate\Database\Eloquent\Model;
class User extends Authenticatable
{
use HasFactory, Notifiable;
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'role',
'name',
'email',
'password',
'idPersona',
'estado'
];
public function Persona(){
return $this->belongsTo(Persona::class,'idPersona');
}
/**
* The attributes that should be hidden for arrays.
*
* @var array
*/
protected $hidden = [
'remember_token'
];
/**
* The attributes that should be cast to native types.
*
* @var array
*/
protected $casts = [
'email_verified_at' => 'datetime',
];
public function hasRole($role)
{
return User::where('role', $role)->get();
}
}
某些逻辑没有正确完成,因为即使没有该角色的用户我也可以访问路由
中间件中的 dd() 用于测试,我得到了“管理员”。
我已经尝试了 Patrick Obafemi 的解决方案,但我仍然遇到同样的问题。
为了测试,我根据 Patrcik 的回答结果做了一个 dd 判断,结果是假的。
我不确定逻辑问题在哪里。
如果对我有帮助,我还将发布我的数据库模型的图片。
【问题讨论】:
-
dd($role);你来这里做什么?
-
'administrador' 忘记删除有问题的,我用它来测试。将添加问题
标签: laravel routes laravel-8 middleware