我创建了一个简单的系统,使用AdminMiddleware为管理面板中的用户设置权限。 每个用户都拥有组,帖子,页面等权限....
路线/网络:
Route::group(['middleware' => 'admin'], function()
{
Route::get('/admin' , 'admin\AdminController@index')->name('admin');
//all admin panel routes
}
在AdminMiddleware中
public function handle($request, Closure $next)
{
if(Auth::check()){
if ($request->user()->user_type !== 'man')
{
return redirect('/');
}
$user_permissions = Auth::user()->permissions;
foreach($user_permissions as $value){
$controller = Controllers::get_controller($value->controller_id);
$permissions['name'] = $controller->controller_name;
$all_permissions[] = $permissions;
unset($permissions);
}
foreach ($all_permissions as $value){
$controllers[] = trim($value['name']);
}
$request->user()->controllers = $controllers;
return $next($request);
}
else{
return redirect('/login');
}
}
因此,我获得了代表控制器名称的所有用户权限列表,并且在每个控制器中(在此控制器中,我检查用户是否具有名为“users”的权限以访问用户控制器以查看其数据)
protected $user;
public function __construct(){
$this->middleware(function ($request, $next) {
$this->user= Auth::user();
if(!in_array('users',$this->user->controllers)){
session()->flash('error' , 'No permission');
return redirect('/admin');
}
else{
return $next($request);
}
});
}
我将它用于每个控制器,它适用于一个小项目,但是当涉及到一个带有模块(nWidart/laravel-modules)的大型项目时,它会很难。我想要的是检查整个模块的权限,而不是模块中的每个控制器。因此,如果我有一个名为blog的模块,我想检查登录用户是否有权访问该模块中的任何控制器,如何做到这一点?
答案 0 :(得分:0)
我为每个模块创建了一个中间件,在中间件中我获得了用户权限并检查他是否有权访问该组
public function handle($request, Closure $next)
{
if(Auth::check()){
if ($request->user()->user_type !== 'man')
{
return redirect('/');
}
$user_permissions = Auth::user()->permissions;
$user_group = Auth::user()->group_id;
if($user_group == 1){ //all permissions admin
return $next($request);
}
else{
//get user permissions as an array
if(in_array('groups',$user_permissions)){ //module name is groups
return $next($request);
}
else{
return redirect('/home');
}
}
}
else{
return redirect('/login');
}
}
路线
Route::group(['middleware' => 'admin'], function()
{
Route::get('/admin' , 'admin\AdminController@index')->name('admin');
});
Route::group(['middleware' => 'users'], function()
{
Route::get('/adminUsers' , '\Modules\Users\Http\Controllers\UsersController@index');
});
Route::group(['middleware' => 'groups'], function()
{
Route::get('/groups' , '\Modules\Groups\Http\Controllers\GroupsController@index');
});