我正在开发一个具有多重身份验证的项目,该项目将管理员,学生和教师作为三个身份验证级别。我已将默认的可验证用户模型更改为学生,并添加了两个具有自己登录名的可验证模型。
我的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以便实现这一目标?请帮助
如果您有其他任何想法,也可以建议我...
答案 0 :(得分:1)
我认为最好通过路线。
对于学生监护人:
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
});
答案 1 :(得分:1)
感谢您的投稿!不久前,我自己就遇到了这个问题,并意识到用中间件来做事情是行不通的。
我发现使用盖茨和政策是最好的选择。因此,基本上,这意味着,每个用户都有一个角色,该角色具有一个权限,并且您可以使用Blade @can
指令来限制对网站某些部分的访问。
您还可以在middleware('can:accessCourse')
路由文件(HTTP路由定义文件)中使用web.php
方法链接来确保路由被“锁定”。如果您使用的是Route::resource
定义,那么可以将$this->authorize('course.index');
行添加到索引公共函数中。
在控制器上使用构造函数很棒,但是您应该只使用一种中间件。即$this->middleware('auth:admin');
然后,该人具有“管理员”访问权限,就可以检查他们是否具有“角色”和后续的权限来执行您想要的任何事情。
在这里我绘制了一个简短的图表,显示了背景情况,并总结了我刚才说的所有内容。
https://drive.google.com/file/d/1uAcL7awPdxVai590WNuJFvDM_wIpsuYo/view?usp=sharing
Youtube上的BitFumes上还有一系列教程,内容涉及如何在路径上创建管理员角色,权限,定义门,添加策略以及使用“可以”中间件!那就是我从我自己那里学到的东西!现在,他可能会有点难以理解,因为英语不是他的母语,但是他知道他的东西!
此链接从播放有关创建博客的播放列表的一半开始,并始于担任管理员角色! :P
https://www.youtube.com/watch?v=aY7X5v37Ebk&index=25&list=PLe30vg_FG4OTELVqQgHaMaq2oELjpSWy_
希望这个答案对您有所帮助,并指导您找到解决问题的方法!