允许多个中间件的控制器方法访问 laravel
allow controller method access for multiple middlewares laravel
我正在开发一个具有多重身份验证的项目,该项目将管理员、学生和教师作为三个级别的身份验证。我已将默认的可验证用户模型更改为学生,并添加了两个具有自己登录名的可验证模型。
我的 CourseController 如下:
use App\Course;
use App\Invoice;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class CourseController extends Controller
{
public function __construct()
{
$this->middleware('auth', ['only' => ['index']]);
$this->middleware('auth:teacher', ['only' => ['index']]);
$this->middleware('auth:admin', ['only' => ['index', 'create', 'store', 'edit', 'update', 'delete', 'search', 'destroy']]);
}
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
$data = Course::get();
if (Auth::user()->role == 'admin') {
return view('admin.course.index', compact('data'));
} elseif (Auth::user()->role == 'student') {
return view('student.course.index', compact('data'));
} elseif (Auth::user()->role == 'teacher') {
return view('teacher.course.index', compact('data'));
}
}
}
config/auth.php如下:(默认守卫为学生)
'defaults' => [
'guard' => 'web',
'passwords' => 'students',
],
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'students',
],
'api' => [
'driver' => 'token',
'provider' => 'students',
],
'admin' => [
'driver' => 'session',
'provider' => 'admins',
],
'admin-api' => [
'driver' => 'token',
'provider' => 'admins',
],
'teacher' => [
'driver' => 'session',
'provider' => 'teachers',
],
'teacher-api' => [
'driver' => 'token',
'provider' => 'teachers',
],
],
我的问题:
我希望所有三个守卫都可以访问 CourseController@index,并将 $data 传递给他们各自的视图。我将如何修改 CourseController 以便实现此目的?请帮忙
如果您有任何其他想法,也可以向我提出建议...
我觉得走route比较好
学生卫:
Route::group(['middleware' => ['auth']], function () {
Route::get('student.course.index', 'CourseController@index');
});
老师守护:
Route::group(['middleware' => ['auth:teacher']], function () {
Route::get('teacher.course.index', 'CourseController@index');
});
对于管理员守卫:
Route::group(['middleware' => ['auth:admin']], function () {
Route::get('admin.course.index', 'CourseController@index');
//other routes
});
感谢您的精彩提交!我 运行 不久前自己也遇到过这个问题,我意识到只在中间件中做事不是可行的方法。
我发现使用 Gates 和 Policies 是最好的选择。所以基本上这意味着,每个用户都有一个角色,那个角色有一个权限,你可以使用 Blade @can
指令来限制对你网站某些部分的访问。
您还可以在 web.php
路由文件(HTTP 路由定义文件)中使用 middleware('can:accessCourse')
方法链接来确保路由是 'locked down' 可以这么说。如果您使用 Route::resource
定义,则可以将行 $this->authorize('course.index');
添加到索引 public 函数中。
在你的控制器上使用构造函数很好,但你应该只使用一个中间件。 IE。 $this->middleware('auth:admin');
然后,一旦该人具有 'admin' 访问权限,您就可以检查他们是否具有角色和后续权限来执行您想要的任何操作。
这是我绘制的一张简短图表,显示了背景中发生的事情并总结了我刚才所说的所有内容。
https://drive.google.com/file/d/1uAcL7awPdxVai590WNuJFvDM_wIpsuYo/view?usp=sharing
Youtube 上的 BitFumes 也有一个教程系列,介绍如何创建管理员角色、权限、定义门、添加策略以及在路由上使用 'can' 中间件!这就是我向自己学习的地方!现在,他可能有点难以理解,因为英语不是他的第一语言,但他知道他的东西!
这个 link 从制作博客的播放列表的一半开始,然后从制作管理员角色开始! :P
https://www.youtube.com/watch?v=aY7X5v37Ebk&index=25&list=PLe30vg_FG4OTELVqQgHaMaq2oELjpSWy_
希望这个回答对您有所帮助,并指导您找到解决问题的方法!
我正在开发一个具有多重身份验证的项目,该项目将管理员、学生和教师作为三个级别的身份验证。我已将默认的可验证用户模型更改为学生,并添加了两个具有自己登录名的可验证模型。
我的 CourseController 如下:
use App\Course;
use App\Invoice;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class CourseController extends Controller
{
public function __construct()
{
$this->middleware('auth', ['only' => ['index']]);
$this->middleware('auth:teacher', ['only' => ['index']]);
$this->middleware('auth:admin', ['only' => ['index', 'create', 'store', 'edit', 'update', 'delete', 'search', 'destroy']]);
}
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
$data = Course::get();
if (Auth::user()->role == 'admin') {
return view('admin.course.index', compact('data'));
} elseif (Auth::user()->role == 'student') {
return view('student.course.index', compact('data'));
} elseif (Auth::user()->role == 'teacher') {
return view('teacher.course.index', compact('data'));
}
}
}
config/auth.php如下:(默认守卫为学生)
'defaults' => [
'guard' => 'web',
'passwords' => 'students',
],
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'students',
],
'api' => [
'driver' => 'token',
'provider' => 'students',
],
'admin' => [
'driver' => 'session',
'provider' => 'admins',
],
'admin-api' => [
'driver' => 'token',
'provider' => 'admins',
],
'teacher' => [
'driver' => 'session',
'provider' => 'teachers',
],
'teacher-api' => [
'driver' => 'token',
'provider' => 'teachers',
],
],
我的问题:
我希望所有三个守卫都可以访问 CourseController@index,并将 $data 传递给他们各自的视图。我将如何修改 CourseController 以便实现此目的?请帮忙
如果您有任何其他想法,也可以向我提出建议...
我觉得走route比较好
学生卫:
Route::group(['middleware' => ['auth']], function () {
Route::get('student.course.index', 'CourseController@index');
});
老师守护:
Route::group(['middleware' => ['auth:teacher']], function () {
Route::get('teacher.course.index', 'CourseController@index');
});
对于管理员守卫:
Route::group(['middleware' => ['auth:admin']], function () {
Route::get('admin.course.index', 'CourseController@index');
//other routes
});
感谢您的精彩提交!我 运行 不久前自己也遇到过这个问题,我意识到只在中间件中做事不是可行的方法。
我发现使用 Gates 和 Policies 是最好的选择。所以基本上这意味着,每个用户都有一个角色,那个角色有一个权限,你可以使用 Blade @can
指令来限制对你网站某些部分的访问。
您还可以在 web.php
路由文件(HTTP 路由定义文件)中使用 middleware('can:accessCourse')
方法链接来确保路由是 'locked down' 可以这么说。如果您使用 Route::resource
定义,则可以将行 $this->authorize('course.index');
添加到索引 public 函数中。
在你的控制器上使用构造函数很好,但你应该只使用一个中间件。 IE。 $this->middleware('auth:admin');
然后,一旦该人具有 'admin' 访问权限,您就可以检查他们是否具有角色和后续权限来执行您想要的任何操作。
这是我绘制的一张简短图表,显示了背景中发生的事情并总结了我刚才所说的所有内容。
https://drive.google.com/file/d/1uAcL7awPdxVai590WNuJFvDM_wIpsuYo/view?usp=sharing
Youtube 上的 BitFumes 也有一个教程系列,介绍如何创建管理员角色、权限、定义门、添加策略以及在路由上使用 'can' 中间件!这就是我向自己学习的地方!现在,他可能有点难以理解,因为英语不是他的第一语言,但他知道他的东西!
这个 link 从制作博客的播放列表的一半开始,然后从制作管理员角色开始! :P
https://www.youtube.com/watch?v=aY7X5v37Ebk&index=25&list=PLe30vg_FG4OTELVqQgHaMaq2oELjpSWy_
希望这个回答对您有所帮助,并指导您找到解决问题的方法!