允许控制器方法访问多个中间件laravel

时间:2018-09-22 12:28:50

标签: laravel laravel-5 middleware guard

我正在开发一个具有多重身份验证的项目,该项目将管理员,学生和教师作为三个身份验证级别。我已将默认的可验证用户模型更改为学生,并添加了两个具有自己登录名的可验证模型。

我的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以便实现这一目标?请帮助

如果您有其他任何想法,也可以建议我...

2 个答案:

答案 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_

希望这个答案对您有所帮助,并指导您找到解决问题的方法!