2016-02-17 2 views
0

Это очень длинный вопрос для (я думаю) очень простой ответ, но я полный новичок в Laravel, и мне нужно знать, обращаюсь ли я к нему правильно путь.Laravel 5 Аутентификация: make Контроллер решает, какие методы являются общедоступными

Что я сделал

Я последовал за Intermediate Tutorial и изменил его только чуть-чуть, и теперь у меня есть простой список задач, который использует проверку подлинности. Я имел это в моем TaskController конструктор:

public function __construct(TaskRepository $tasks) 
{  
    $this->middleware('auth'); 
} 

Проверяется, если пользователь вошел в систему, прежде чем запускать какие-либо методы, так что я просто нужно, чтобы называть их, как это в моем routes файле:

Route::get('/home', '[email protected]'); 
Route::get('/tasks', '[email protected]'); 

Тогда Я хотел удалить требование проверки подлинности для метода index, чтобы все пользователи могли видеть домашнюю страницу (где я перечисляю все задачи), и только прошедшие проверку подлинности пользователи могут видеть страницу/tasks (где я перечисляю только пользовательские задачи и позволяют их удалить). Мне удалось сделать это следующим образом:

1) Я удалил $this->middleware('auth') из TaskController конструктора

2) Я изменил мой routes файл выглядеть следующим образом:

Route::get('/home', '[email protected]'); 
Route::get('/tasks', [ 
    'middleware' => 'auth', 
    'uses' => '[email protected]' 
]); 

Хорошо, это работает, но :

То, что я хочу достичь

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

class TaskController extends Controller 
{ 
    /** 
    * Display a list of all current tasks 
    */ 
    public function index() 
    { 
     return view('tasks.index', [ 
      'tasks' => Task::orderBy('created_at', 'asc')->get() 
     ]);    
    } 

    /** 
    * Display a list of all of the logged user's task. 
    * 
    */ 
    public function indexUser(Request $request) 
    { 
     if (Auth::check() { 
      return view('tasks.index_user', [ 
       'tasks' => $this->tasks->forUser($request->user()), 
      ]); 
     } else { 
      //This is what I don't know how to do: 
      redirect_to_login 
     } 
    } 
} 

Как я могу это достичь?

ответ

2

Вы можете решить, какой метод контроллер должен выполнить промежуточное:

public function __construct() 
{ 
    $this->middleware('auth', ['only' => ['indexUser', 'update'] ]; 
} 

просто добавить в only метод, который вы хотите защитить.
Когда пользователь попытается получить доступ к методу, он автоматически перенаправится на страницу входа в систему.

Здесь вы можете найти в документации: https://laravel.com/docs/5.1/controllers#controller-middleware

+0

Ohhhhh я полностью пропустил, чтобы проверить это! Конечно! Так много, чтобы учиться :) –

1

Вы можете сделать следующее, если вы хотите эту логику в контроллере:

if (!Auth::check()) { 
    return redirect('/path/to/login/page'); 
} 

Таким образом, вы не великан, если другое заявление в контроллере. (Удобно, если ваш контроллер содержит больше логики, а затем образец выше)

Я лично хотел бы получить ответ, предоставленный Кристианом Гиппони. Причина в том, что для этой логики в конструктивной функции больше смысла, чем в вашем контроллере.

Смежные вопросы