【问题标题】:Laravel user role access content in viewLaravel 用户角色访问视图中的内容
【发布时间】:2018-02-13 13:12:07
【问题描述】:

拥有超过 150 个视图,其中包含编辑、查看和添加列的表格内容。我想根据用户角色限制视图。例如。如果管理员登录,他可以看到所有选项,如果其他他只能添加不能删除和编辑。我们怎样才能做到这一点?一种方法是为不同的角色调用不同的视图,但这并不是多余的,甚至有超过 150 个视图。

【问题讨论】:

  • 你可以使用中间件。阅读this,特别是“保护路由”部分
  • 身份验证已经完成,甚至根据角色显示选项卡,但我的要求是限制表中不同角色的列
  • 研究一下Laravel Authorization - laravel.com/docs/5.6/authorization

标签: php laravel-5 middleware


【解决方案1】:

Blade 中的条件渲染

您可以在视图中检查用户权限,然后决定用户应该能够看到什么,什么不能。

@if(Auth::user()->admin) 
    <input name="website_logo_url" type="text" />
@endif

使用中间件

您可以使用中间件拒绝对某些视图的访问。

【讨论】:

  • 是的,这是其中一个想法,但有超过 150 次浏览,甚至大约 10 个角色。如果其他条件需要添加所有页面,则此解决方案可能会更多。任何其他解决方案
  • 您需要隐藏整个视图还是只隐藏部分视图?如果您需要隐藏某些 URL 以使没有权限的人无法使用它们,您可以使用中间件来完成,如果您需要隐藏部分视图,则需要一些时间,您需要编辑这些视图并添加它们您需要的行为.. PS:这是一个非常糟糕的做法,但您可以使用 ob_start、ob_end_flush 等 PHP 函数生成视图并在 HTML 缓冲区到达用户之前捕获它。然后你可以删除一些 HTML,但我再说一遍:在 Laravel 中这样做非常糟糕,因为你已经有了 Blade!
【解决方案2】:

当您的数据库中有一个包含角色的表时,您可以在 web.php 文件中执行类似的操作

Route::group(['middleware' => 'App\Http\Middleware\AdminMiddleware'], function() {

....

});

然后您制作一个名为“AdminMiddleware”或类似名称的中间件。

您在该中间件组中设置的每条路由都仅限于您在中间件文件中放置的内容。看看这个中间件文件:

public function handle($request, Closure $next)
{
    $allowed_role_ids = [2];

    if (!in_array($request->user()->role_id, $allowed_role_ids))
    {
        return redirect('/')->with('flash', 'U heeft hier geen toegang voor');
    } elseif(Auth::guest()) {

        return redirect('/')->with('flash', 'U bent een gast, U heeft hier geen toegang voor');
    }

    return $next($request);
}

如果用户的请求角色 ID 不是允许的角色 ID,则不允许访问该路由。如果是,它将重定向到所需的路线。我希望这能解决您的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-27
    • 1970-01-01
    • 2012-02-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多