用于检查两个不同守卫的 Auth 中间件的控制器构造函数

Controller constructor to check Auth middleware for two different guards

我有一个显示特定内容的仪表板视图,具体取决于正在查看的用户,无论是管理员还是普通用户。

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

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

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

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'));
    });
}

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

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() 只是 returns 当前经过身份验证的用户,无论其角色如何。

没有 auth 中间件,策略将永远无法工作