【问题标题】:Laravel - How to restrict certain functionality based on user authentication?Laravel - 如何根据用户身份验证限制某些功能?
【发布时间】:2017-07-09 01:44:30
【问题描述】:

这里是 Laravel 新手(显然是 :D )。我为名为@9​​87654321@ 的模型设置了一个新模型和控制器。

每个User 都有很多Pages

每个Page 都有一个User

我创建了以下功能控制器操作(和视图):

PagesController::index
PagesController::create
PagesController::store
PagesController::show
PagesController::edit
PagesController::delete

因此您可以通过转到url.dev/pages/{id}/edit 来编辑Page

问题是,无论您的会话状态如何,您都可以访问所有这些路由。所以随机用户可以编辑任何给定的Page。显然,这很糟糕。

谁能指出我应该阅读的方向,根据用户是否登录(如果它是正确的 用户)?

【问题讨论】:

    标签: php laravel


    【解决方案1】:

    要强制特定路由只能由经过身份验证的用户访问,您可以在控制器构造函数中指定中间件身份验证,如下所示:

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

    您还可以使用onlyexcept 参数限制要在控制器中应用身份验证的方法。仅使用您可以做到:

    public function __construct()
    {
        $this->middleware('auth', ['only' => ['create', 'store', 'edit', 'delete']]);
    }
    

    【讨论】:

    • 太棒了!现在,如果我只想限制几个控制器操作而不是全部,我会在我想要限制的那些操作中尝试这个吗?
    【解决方案2】:

    您正在寻找中间件.. 你可以阅读更多here

    public function __construct()
    {
        $this->middleware('auth')->only('index');
    
        $this->middleware('admin')->except('store');
    }
    

    【讨论】:

    • 完美,我知道这一定是我还没有遇到过的事情。谢谢大佬!
    【解决方案3】:

    其他答案很好,但我更喜欢在路由组上使用中间件。

    所以当我有几条这样的路线时:

    Route::get('pages', 'PagesController@index')->name('pages.index');
    
    Route::get('pages/{id}/edit', 'PagesController@edit')->name('pages.edit');
    

    我会将它们添加到 Laravel Route 组中。像这样:

    Route::group(['middleware' => 'auth'], function() {
        Route::get('pages', 'PagesController@index')->name('pages.index');
    
        Route::get('pages/{id}/edit', 'PagesController@edit')->name('pages.edit');
    });
    

    【讨论】:

      猜你喜欢
      • 2014-06-05
      • 1970-01-01
      • 1970-01-01
      • 2013-09-09
      • 2021-03-18
      • 2014-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多