gpt4 book ai didi

php - Laravel 8 应用出现用户访问错误的原因是什么?

转载 作者:行者123 更新时间:2023-12-04 01:01:57 25 4
gpt4 key购买 nike

我做了一个 Laravel 8 application (链接到 GitHub 存储库)需要用户注册和登录。

我目前正在努力添加用户角色和权限。我有 3 个角色(用户类型):管理员、作者和成员。每种类型的用户都应该有权访问仪表板的一部分。

用户表:

enter image description here

角色表:

enter image description here

routes\web.php 我有:

Route::get('/', [HomepageController::class, 'index'])->name('homepage');

Auth::routes();

Route::group(['middleware' => ['auth']], function() {
Route::get('/dashboard', [DashboardController::class, 'index'])->name('dashboard');
Route::get('/dashboard/profile', [UserProfileController::class, 'index'])->name('profile');
Route::match(['get', 'post'],'/dashboard/profile/update', [UserProfileController::class, 'update'])->name('profile.update');
Route::post('/dashboard/profile/deleteavatar/{id}/{fileName}', [UserProfileController::class, 'deleteavatar'])->name('profile.deleteavatar');

//User roles
Route::get('/dashboard/author', [AuthorController::class, 'index']);
});

User 模型 (app\Models\User.php) 中我有:

class User extends Authenticatable
{
use HasFactory, Notifiable;

/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'role_id',
'username',
'first_name',
'last_name',
'email',
'password',
];

/**
* The attributes that should be hidden for arrays.
*
* @var array
*/
protected $hidden = [
'password',
'remember_token',
];

/**
* The attributes that should be cast to native types.
*
* @var array
*/
protected $casts = [
'email_verified_at' => 'datetime',
];

public function roles() {
return $this->belongsToMany(Role::class);
}

public function users()
{
return $this
->belongsToMany('App\User');
}

public function authorizeRoles($roles)
{
if ($this->hasAnyRole($roles)) {
return true;
}
abort(401, 'This action is unauthorized.');
}

public function hasAnyRole($roles)
{
if (is_array($roles)) {
foreach ($roles as $role) {
if ($this->hasRole($role)) {
return true;
}
}
} else {
if ($this->hasRole($roles)) {
return true;
}
}
return false;
}

public function hasRole($role)
{
if ($this->roles()->where('name', $role)->first()) {
return true;
}
return false;
}
}

AuthorController (Controllers\Dashboard\AuthorController.php)

class AuthorController extends Controller
{
public function __construct()
{
$this->middleware('auth');
$this->middleware('role:ROLE_Author');
}

public function index()
{
return view('dasboard.author');
}
}

如 CheckRole 中间件所示,如果用户未经授权,则消息应为“此操作未经授权”:

class CheckRole
{
/**
* 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)) {
abort(401, 'This action is unauthorized.');
}
return $next($request);
}
}

问题

由于我无法找到的原因,尝试将作者重定向到管理面板的它的部分会导致 403 错误:

User does not have any of the necessary access rights.

问题

我做错了什么?

最佳答案

在检查了你的代码之后,我发现了一些错误

1.在 AuthorController 中,您将角色传递为 ROLE_Author 而不是 Author

 $this->middleware('role:ROLE_Author');

但是在 db 中你将角色名称命名为 Author 所以它应该是

$this->middleware('role:Author');

2.在 User 模型中你有 hasRole($role) 方法但是它正在访问 role relationshipbelongsToMany 关系

 public function roles() {

return $this->belongsToMany(Role::class);
}

所以如果你检查数据库 role_user 有空记录。所以在 role_user 表中添加相关数据,但现在你在 users 表中添加角色.

假设您要在用户表中分配角色,然后更改用户表中的关系角色

 public function roles() {
return $this->belongsTo(Role::class,'role_id','id');
}

如果用户没有访问权限,则会抛出以下错误,否则会转到仪表板。

401 UNAUTHORIZED

同样在 MemberController 中你必须改变中间件

  $this->middleware('role:ROLE_Member');

  $this->middleware('role:Member');

同样在 AuthorController 中。 Blade 文件名有错误。 view('dasboard.author') 但如果您看到 view folder 那么您已将文件夹命名为 dashboard 但在 View 中您提到了 dasboard.作者所以从这个改变

 public function index()
{
return view('dasboard.author');
}

 public function index()
{
return view('dashboard.author');
}

注意:查看后我没有发现提到的错误消息“用户没有任何必要的访问权限。”在 git repo 中。它也不会为未经授权的用户抛出 403 错误。所以尝试清除 View 缓存,浏览器缓存。

关于php - Laravel 8 应用出现用户访问错误的原因是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68045942/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com