控制器构造函数检查Auth中间件是否有两个不同的防护

时间:2018-01-27 17:32:30

标签: laravel laravel-5

我有一个信息中心视图,根据用户正在查看的内容显示某些内容,无论是管理员还是普通用户。

我可以将我的管理员放到该页面上,但由于我的中间件防护,普通用户目前无法使用。

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:-1)

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

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