【问题标题】:Laravel roles with laravel-permission具有 laravel 权限的 Laravel 角色
【发布时间】:2017-06-20 13:25:25
【问题描述】:

我正在使用laravel-permission 包。我创建了两个角色adminuser,并将admin 角色与权限Access CMS 相关联。我还创建了两个用户,一个具有admin 角色,另一个具有user 角色。

我已将所有admin 路由放在AdminMiddleware 后面:

Route::group(['prefix' => 'admin', 'middleware' => ['auth', 'isAdmin']], function() {
  // Routes
}

中间件来自this tutorial

public function handle($request, Closure $next)
{
    if (!Auth::user()->hasPermissionTo('Access CMS')) {
        die('aargh');
    }

    return $next($request);
}

这适用于具有admin 角色的用户。问题是,当我与其他用户一起登录时,它dies(应该如此)但用户仍然处于登录状态。即如果我在此尝试后回显Auth::user(),它将显示非admin 用户。我期待的是它完全阻止该用户登录。我错过了什么?

【问题讨论】:

  • 如果用户没有该路由的权限,为什么要记录用户身份验证? IMO 将此用户重定向到某个页面并显示他无权访问的错误会更合乎逻辑:return redirect()->route('home')->withErrors['No access']
  • 我的观点是,当它到达该中间件时,用户已经登录。如果我将 return 语句放在中间件中,用户仍然会登录。

标签: php laravel authentication permissions


【解决方案1】:

可能不是最好的选择,但你可以试试。

Auth::logout();

然后在用户退出后将其返回家中。

【讨论】:

    【解决方案2】:

    您错过了首先执行auth 中间件。中间件按照它们在数组中声明的顺序执行。 routing groups

    要实现完全不登录,您将不得不更改中间件的顺序,但您将无法再使用Auth::user(),因为用户不会被认证。因此,要在没有Auth::user() 的情况下执行此操作,您必须自己查询数据库以找到用户对象,然后检查权限。虽然不建议这样做。为什么用户是否经过身份验证很重要?

    【讨论】:

    • 为什么不建议先找到用户对象再检查权限?我还能如何检查权限?
    猜你喜欢
    • 2017-09-13
    • 2014-09-15
    • 2019-04-27
    • 2019-07-31
    • 1970-01-01
    • 2019-05-03
    • 2018-05-29
    • 2017-02-06
    • 2022-01-01
    相关资源
    最近更新 更多