【问题标题】:Controller constructor to check Auth middleware for two different guards控制器构造函数检查 Auth 中间件是否有两个不同的防护
【发布时间】:2018-07-06 19:21:30
【问题描述】:

我有一个仪表板视图,根据正在查看的用户(无论是管理员还是普通用户)显示某些内容。

我可以让我的管理员进入该页面,但由于我的中间件保护,普通用户目前无法访问。

class DashboardController extends Controller {

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

    public function index()
    {
        return view('dashboard.index');
    }
}

以下代码检查每个 DashboardController 调用 auth:admins,但我希望普通用户也可以访问它,有没有办法像这样检查 auth 中间件两次?

$this->middleware(['auth:admin','auth']);

因此理想情况下,它会检查您是管理员还是普通身份验证用户。

在我的视图页面上,当访问我正在使用的管理员的属性时:

{{ Auth::user()->admin_username }}

这正常吗?我有一个管理员模型,但我仍然通过 Auth::user() 访问它,这对我来说感觉很奇怪,不应该是 Auth::admin()->admin_username

【问题讨论】:

  • 你找到构造函数的解决方案了吗

标签: laravel laravel-5


【解决方案1】:

为不同角色的用户访问特定页面更适合 laravel 门和策略授权机制。

https://laravel.com/docs/5.5/authorization#writing-gates

这些允许您为您拥有的每个用例编写微调规则。简单的门可以定义为应用程序 AuthServiceProvider 中的闭包。例如:

public function boot()
{
    $this->registerPolicies();

    Gate::define('access-dashboard', function ($user, $post) {
        return auth()->check() && (auth()->user()->hasRole('admin') || auth()->user()->hasRole('regular'));
    });
}

然后你可以在任何需要的地方使用门面,例如控制器方法或构造函数。

if (Gate::allows('access-dashboard', $model)) {
    // The current user can access dashboard, load their data
}

或者直接在用户模型上使用cancant 帮助器。

if (auth()->user()->can('access-dashboard')) {
    //
}

当然,你也可以通过中间件来实现类似的功能,使用上面的好处是你可以在代码中的特定点授权动作以及可重用性。

至于最后一个问题,你写的是正确的。

{{ Auth::user()->admin_username }}

Auth::user()auth()->user() 仅返回当前已通过身份验证的用户,无论其角色如何。

【讨论】:

    【解决方案2】:

    没有身份验证中间件,策略将永远无法工作

    【讨论】:

      猜你喜欢
      • 2018-08-20
      • 2018-02-11
      • 2018-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-19
      • 2015-09-08
      • 1970-01-01
      相关资源
      最近更新 更多