【发布时间】:2021-05-31 19:14:57
【问题描述】:
我得到了用户、角色、权限和角色用户、角色权限。
我想做的是:
- 在用户模式中检查请求用户的权限是什么。
【问题讨论】:
我得到了用户、角色、权限和角色用户、角色权限。
我想做的是:
【问题讨论】:
Laravel 建议 gate policy 进行授权。最好的方法是学习它:
https://laravel.com/docs/8.x/authorization
但如果您想使用自己的方法。您可以使用中间件并将其添加到您想要保护它们的所有路由中。
php artisan make:middleware MyauthMiddleware
把这段代码放进去:
<?php
namespace App\Http\Middleware;
use Closure;
class MyauthMiddleware
{
public function handle($request, Closure $next,$permission_id)
{
if (Auth::user()) { // if user is logined
// Do what you want from your tables.
// Here is the most important part you should use.
//I wrote sample bellow:
$roles = RoleUser::where('user_id',Auth::user()->id)->get();
foreach($roles as $role_user){
if($role_user->role->permision->id == $permission_id){
return $next($request);
}
}
}
return redirect('/');
}
然后在 app/Http/Kernel.php 类的 $middleware 属性中添加新的中间件类。
protected $routeMiddleware = [
//....
'myauthcheck' => \App\Http\Middleware\MyauthMiddleware::class,
];
然后在你的路由上设置中间件:
Route::group(['middleware' => 'myauthcheck:832'], function () {
//your routes here related to 832 permission_id
});
【讨论】:
$role->permission->id,你应该在Role模型中拥有hasMany到permission的关系。
roles where user_id = 1) 我做错了什么?
如果我没听错,您正在寻找一种查询数据库的方法。不幸的是,你不能直接使用 Laravel 的 Eloquent ORM 来做到这一点,并且需要一些额外的努力,在我看来这不是很有效。所以这就是 SQL 的方式:
SELECT `permissions`.* FROM `permissions` JOIN `role_permission` ON (`permissions`.`id` = `role_permission`.`permission_id`) WHERE `role_permission`.`role_id` IN (SELECT `role_id` FROM `user_role` WHERE `user_role`.`user_id` = $USER_ID)
希望对你有帮助。
【讨论】: