Laravel 5身份验证:make Controller决定哪些方法是公开的

时间:2016-02-17 15:14:55

标签: laravel authentication laravel-5

这是一个非常长的问题(我认为)一个非常简单的答案,但我是Laravel的新手,我需要知道我是否以正确的方式解决它。

我做了什么

我跟着Intermediate Tutorial并稍微修改了一下,现在我有一个使用身份验证的简单任务列表。我在我的TaskController构造函数中有这个:

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

这将检查用户是否在启动任何方法之前已登录,因此我只需要在我的routes文件中调用它们:

Route::get('/home', 'TaskController@index');
Route::get('/tasks', 'TaskController@indexUser');

然后我想删除index方法的身份验证要求,以便所有用户都可以看到/ home页面(我列出所有任务),只有经过身份验证的用户才能看到/ tasks页面(我只列出用户任务并允许删除它们。我设法做到了这样:

1)我从$this->middleware('auth')构造函数

中删除了TaskController

2)我修改了我的routes文件,如下所示:

Route::get('/home', 'TaskController@index');
Route::get('/tasks', [
    'middleware' => 'auth',
    'uses' => 'TaskController@indexUser'
]);

好的,这可行,但是:

我想要实现的目标

我不希望在我的路径文件中有这个逻辑,我希望我的Controller决定哪些方法是公共的,哪些方法不公开。但是我被困住了。我认为它应该是这样的:

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 个答案:

答案 0 :(得分:2)

您可以决定哪个控制器方法应该执行中间件:

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

只需添加only您要保护的方法即可 当用户尝试访问某个方法时,会自动重定向到登录页面。

您可以在此处找到文档:https://laravel.com/docs/5.1/controllers#controller-middleware

答案 1 :(得分:1)

如果您想在控制器中使用此逻辑,则可以执行以下操作:

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

这样你的控制器中就没有Giant else语句了。 (如果您的控制器包含的逻辑比上面的示例更多,则很方便)

我个人会选择Christian Giupponi提供的答案。因为在构造函数中然后在控制器中处理这个逻辑会更有意义。