【问题标题】:Check the user's auth in all controllers' actions在所有控制器的操作中检查用户的身份验证
【发布时间】:2017-01-13 19:05:38
【问题描述】:

我使用 Laravel 5.3,但遇到以下问题。

[更新]

我最初的问题是在用户未登录系统时在网站上执行操作时出现错误。

这发生在浏览器启动时,页面上默认显示缓存信息。为登录用户显示的站点界面,在他的系统中没有。同时,产生一些动作,我得到一个用户未授权的错误。

我的所有路由也有组身份验证中间件。当我重新启动站点页面时,中间件被激活并将我重定向到登录页面。主要问题是浏览器显示缓存信息。

所以,除了路由的中间件,我决定在控制器中进行身份验证检查。

[/更新]

我想在每个控制器的操作中检查用户的身份验证。手动检查每个控制器的操作不是解决方案,因为有很多控制器和操作。

所以我决定在全球推广。

由于所有控制器都扩展了主控制器 (App\Http\Controllers\Controller.php),我决定编写 auth()->check() 在构造函数中:

function __construct()
{
    if(auth()->check()) dd('success');
}

但是...什么也没发生(((然后我在主控制器扩展的BaseController中找到了callAction方法并在这里进行了检查:

public function callAction($method, $parameters)
{
    if(auth()->check()) dd('success');
    return call_user_func_array([$this, $method], $parameters);
}

这次一切正常,但我不喜欢这个解决方案,因为编辑核心文件并不好。

最后,我在主控制器中重新声明了 callAction 方法并进行了身份验证,但我也不喜欢这种方式。

有什么解决办法吗?

【问题讨论】:

  • 使用中间件怎么样?
  • 我试过这种方式,但它对我不起作用(什么都没发生。
  • 关注this answer

标签: php laravel authentication laravel-5


【解决方案1】:

你应该使用middleware:

Route::get('profile', ['middleware' => 'auth', 'uses' => 'UserController@showProfile']);

或者:

Route::get('profile', 'UserController@show')->middleware('auth');

或者使用middleware groups:

Route::group(['middleware' => ['auth']], function () {
    // Controllers here.
});

或者使用controller's construct:

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

【讨论】:

  • 我有超过 50 条路线,包括 ajax 请求。不是每条路由都要重写的解决方案……
  • @PaulBasenko 为此使用middleware groups。这是我回答中的第三个选项。
  • 团体路线我已经用过了。正如我所说,我需要在控制器的操作中进行身份验证检查,而不是在路由中。
  • @PaulBasenko 你在这里重新发明轮子。创建中间件就是为了解决这类问题。如果您想构建可维护的应用程序,中间件是正确的选择。
  • 我最初的问题是在用户未登录系统时在站点上执行操作时出现错误。这发生在浏览器启动时,缓存信息默认显示在页面上。为登录用户显示的站点界面,在他的系统中没有。同时,产生一些动作,我得到一个用户没有被授权的错误。因此,除了路由的中间件,我决定在控制器中进行身份验证检查。
【解决方案2】:

您可以在控制器中使用auth 中间件

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

在这里查看:https://laravel.com/docs/5.3/authentication

【讨论】:

    【解决方案3】:

    如果有一组路线,这将是最简单的方法

    Route::group(['middleware' => ['auth']], function()
    {
        // here all of the routes that requires auth to be checked like this
        Route::resource('user','UsersController');
    }
    

    其他方法

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

    在控制器路由上指定了另一种方式

    Route::get('profile', [
        'middleware' => 'auth',
        'uses' => 'UserController@showProfile'
    ]);
    

    查看文档

    https://laravel.com/docs/5.0/controllers#controller-middleware

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-29
      • 2023-04-10
      • 1970-01-01
      • 1970-01-01
      • 2019-01-21
      • 1970-01-01
      • 2013-05-05
      • 2014-08-06
      相关资源
      最近更新 更多