【问题标题】:Laravel 5.2 custom user permission checkLaravel 5.2 自定义用户权限检查
【发布时间】:2017-07-19 13:35:34
【问题描述】:

我想进行权限检查,如果用户没有权限,将禁止他们访问某些页面和按钮。在我的数据库中,我有一个用户表和权限表,然后是一个 permission_user 表来为每个用户分配权限。

现在,我有一个页面,其中显示了一个包含所有数据摘要的表格,并且那里有一组按钮(查看、编辑等),有些用户无法完成所有这些操作,所以我想要这些按钮不可见/禁用。如果他们在 URL 中键入这些按钮(例如 public/admin/edit/id),我不希望他们访问与这些按钮链接的受限页面。

这是当前可用的权限

  PermissionID  PermissionName
        1            View
        2            Add
        3            Edit
        4            Delete

现在在我的 permissions_user 表中是这样的

   PermissionID   AccountID
        1             2

这是我的控制器的一部分

public function showDetails($action, $id)
    {
        return view('pages.admin.form_details', ['action' => $action, 'id' => $id]);
    }

这个示例函数将显示详细信息页面和返回操作(字符串是查看或编辑),然后在我的刀片中检查查看或编辑页面的显示。如果可能的话,我想一次进行所有检查(就像如果用户登录或未通过中间件登录,您如何检查每个页面)。我实际上尝试了 zizaco entrust,但我不明白如何实现它并最终将其从我的项目中删除。

我一直在考虑在每个页面控制器的显示功能中做这样的事情。

if($action == "edit)
//check if edit permission exists for the authenticated user. if not abort and show error page.

我认为这样做是低效且重复的。会有更好的解决方案吗?或者也许是我可以更容易集成的包?

【问题讨论】:

    标签: php laravel laravel-5.2


    【解决方案1】:

    Laravel 5.2 对此有适当的功能:Authorizations

    我更喜欢使用策略来定义能力,因为如果您的应用程序增长,它们可能更具可扩展性。

    1. 注册政策

      protected $policies = [
          'App\Model' => 'App\Policies\ModelPolicy',
      ];
      
      public function boot(GateContract $gate)
      {
              $this->registerPolicies($gate);
      }
      
    2. 定义策略

      public function index(User $user)
      {
          return // your validation;
      }
      
      public function create(User $user)
      {
          return // your validation;
      }
      
    3. 检查政策

    在您的控制器中:

    public function store(ModelRequest $request)
    {   
        $this->authorize('create', $model);
        // your code to create a new model
    }
    

    在你看来:

    @can('create', $post)
       <!-- If user can create a model -->
    @endcan
    

    重要的是检查控制器中的策略,以这种方式使用它,如果用户没有正确的权限,将不会被允许执行任何后续步骤。

    另一方面,有一些其他 SO 用户提到的包,但是您的请求非常简单,因此您可以使用 Laravel 的授权。

    【讨论】:

    • 感谢您的回答!这对我很有帮助,因为我觉得文档有点混乱。
    【解决方案2】:

    Laravel 5.2 有一个内置的授权方法:

    https://laravel.com/docs/5.2/authorization

    策略特别好,它们代表了您正在寻找的权限类型。

    如果您需要更多功能,请查看 spatie 的 laravel-permission package,它添加了许多角色管理等功能。

    【讨论】:

    • Spatie 可能不错。我会尝试再次阅读文档以理解它。谢谢。
    • 我打算推荐 laravel-permission 包。我刚刚在我的应用程序上实现了这个包,值得花时间去了解它是如何工作的,而不是尝试编写自己的/重复的代码。
    【解决方案3】:

    Laravel 包含一个授权系统,可以根据您的需要工作。你已经检查了吗? https://laravel.com/docs/5.2/authorization

    【讨论】:

    • 我做到了,但老实说我不太了解它。这适用于我的项目结构吗?
    猜你喜欢
    • 2015-07-29
    • 2018-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-27
    • 1970-01-01
    • 1970-01-01
    • 2014-01-10
    相关资源
    最近更新 更多