разрешить доступ к методу контроллера для нескольких промежуточных программ - PullRequest
0 голосов
/ 22 сентября 2018

Я работаю над проектом с множественной аутентификацией, в котором администраторы, студенты и преподаватели имеют три уровня аутентификации.Я изменил аутентифицируемую пользовательскую модель по умолчанию на студента и добавил еще две аутентифицируемые модели, которые имеют свои собственные логины.

У меня есть 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 был доступен для всех трех охранников и передавал данные $ ихсоответствующий вид.Как бы я изменил CourseController, чтобы я мог добиться этого?Пожалуйста, помогите

Если у вас есть другие идеи, вы можете предложить мне это тоже ...

Ответы [ 2 ]

0 голосов
/ 23 сентября 2018

Спасибо за потрясающее представление!Я сам столкнулся с этой проблемой некоторое время назад и понял, что делать вещи только в промежуточном программном обеспечении - это не тот путь.

Я обнаружил, что использование Gates и Policies - лучший путь.В общем, это означает, что у каждого пользователя есть роль, у этой роли есть разрешение, и вы можете использовать директиву Blade @can, чтобы ограничить доступ к определенным частям вашего сайта.

Вы также можетеиспользуйте цепочку middleware('can:accessCourse') в файле маршрутов web.php (файл определения маршрутов HTTP), чтобы убедиться, что маршрут, так сказать, «заблокирован».Если вы используете определение Route::resource, тогда вы можете добавить строку $this->authorize('course.index'); в вашу открытую функцию index.

Использование конструктора на вашем контроллере - это замечательно, но вы должны использовать только одно промежуточное ПО для этого,IE $this->middleware('auth:admin'); Затем, когда у этого человека есть доступ с правами администратора, вы можете проверить, есть ли у него Роль и последующие разрешения, чтобы делать то, что вы хотите.

Вот небольшая диаграмма, которую я нарисовал, показывая, чтопродолжая в фоновом режиме и суммируя все то, что я только что сказал.

https://drive.google.com/file/d/1uAcL7awPdxVai590WNuJFvDM_wIpsuYo/view?usp=sharing

Также BitFumes на Youtube имеет серию руководств о том, как создавать роли администратора, разрешения, определения ворот,Добавление политик и использование промежуточного программного обеспечения «can» на ваших маршрутах!Вот где я учился у себя!Теперь он может быть немного трудным для понимания, поскольку английский не является его родным языком, но он знает свое дело!

Эта ссылка начинается на полпути через плейлист о создании блога и начинается с назначения администратором ролей.!: P

https://www.youtube.com/watch?v=aY7X5v37Ebk&index=25&list=PLe30vg_FG4OTELVqQgHaMaq2oELjpSWy_

Надеюсь, что этот ответ помог вам и направил вас к поиску решения вашей проблемы!

0 голосов
/ 22 сентября 2018

Я думаю, что лучше сделать это по маршруту.

Для студенческой охраны:

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 });

...