【问题标题】:How to filter request parameters based on user role in Laravel?如何在 Laravel 中根据用户角色过滤请求参数?
【发布时间】:2019-08-10 00:11:24
【问题描述】:

我有一个具有管理员、经理和员工角色的应用。 经理可以编辑所有员工的字段 A、B、C。 管理员可以编辑所有用户的字段 A、B、D、E。

问题:我应该如何根据用户角色过滤参数?

注意事项:

  1. 我不想用if/else 子句过滤控制器内部的参数,因为感觉太脏了。
  2. 有一个扩展FormRequest 类的选项,但这是一种很老套的方法。代码最终变得不太可读,因为FormRequest 永远不会用于操作请求。
  3. 我可以将此逻辑分离到控制器内部的私有方法中。它可以工作,但仍然有一个胖控制器。
  4. 我可以为管理员、经理和用户分离路由和控制器。代码看起来更简单,但结构更复杂。

你们对此有何看法?还有其他建议吗?

非常感谢!

编辑:-------------
只是澄清一下,因为许多人对我的要求感到困惑:

我已经在使用PolicyGate 进行授权。当您想更新用户时,我要问的是关于这种特定情况的问题。经理可以更新某些特定字段(A、B、C),而管理员可以更新其他字段(A、B、D、E)。
现在我们需要根据用户角色接受不同的请求参数,但是我们应该在哪里做呢?在这个控制器中,在扩展的 FormRequest 类中还是在单独的控制器中?

谢谢!!!

【问题讨论】:

  • 您可以使用门和策略https://laravel.com/docs/5.8/authorization 您可以根据管理员角色管理route, controller, blade
  • 你考虑过custom validation rules吗?

标签: laravel parameters request authorization roles


【解决方案1】:

也许是在黑暗中开枪,但是您能否为您拥有的每个角色创建一个类,该类具有决定该特定角色可用哪些字段的常量?

class AdminRole
{
    CONST EDITABLE_USER_FIELDS = [
        'name',
        'address',
        'phone',
        ...
    ];
}

在您的要求中:

$className = ucfirst($user->getRole()) . 'Role';

$fields = $className::EDITABLE_USER_FIELDS;

$data = $request->only($fields);

我没有对此进行测试,但只要您的类名与角色名相同,这应该可以工作。

希望这会有所帮助!

【讨论】:

  • 这是我没有想到的方法。很有意思!一个问题是关于验证,因为每个字段都有自己的验证。这个 Role 类也需要包含它。但是,我不确定这个和我创建一个单独的控制器的方法之间哪个更好。
  • 您可以为此创建一个请求,并在那里获取相同的字段。 laracasts.com/discuss/channels/general-discussion/…也许这能帮上忙?
【解决方案2】:

我认为您正在使用同一张表说“用户”来存储管理员、经理和员工的数据。做一个新列说'user_role'。每个用户将分别获得 1、2 和 3 个用于管理员、经理和员工。您只需要从表中获取 'user_role'。

接下来,您需要为角色制作泛型函数并将user_role传递给它。

【讨论】:

    【解决方案3】:

    我在很久以前看过但忘记的 Laracasts 上找到了这个视频。它给了我所需的确切答案。
    显然创建一个新的控制器并坚持 Laravel 的 CRUD 约定是要走的路。 https://laracasts.com/series/laravel-from-scratch-2018/episodes/20

    感谢大家花时间回答我的问题!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多